广元企业网站建设品牌推广策划营销策划

张小明 2026/1/9 9:03:46
广元企业网站建设,品牌推广策划营销策划,深圳建站模板,徐州cms模板建站文章目录接口校验#xff0c;权限拦截通过自定义注解#xff0c;基于面向切面编程来实现1. 自定义异常2. 自定义注解3. AOP面向切面类4. Controller层使用统一异常处理和信息返回1. 创建统一信息返回类2. 创建全局统一异常处理类3. 创建一个枚举类型4. 创建自定义的异常类拦截…文章目录接口校验权限拦截通过自定义注解基于面向切面编程来实现1. 自定义异常2. 自定义注解3. AOP面向切面类4. Controller层使用统一异常处理和信息返回1. 创建统一信息返回类2. 创建全局统一异常处理类3. 创建一个枚举类型4. 创建自定义的异常类拦截器JWT实现登录校验1. 添加依赖2. JWT工具包3. Threadlocal保存用户信息4. 拦截器校验登录5. 注册拦截器6. 自定义注解AOP角色校验7. Controller层示例接口校验权限拦截通过自定义注解基于面向切面编程来实现加依赖dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-aop/artifactId/dependencydependencygroupIdcom.google.guava/groupIdartifactIdguava/artifactIdversion29.0-jre/version/dependency1. 自定义异常// com.yourpackage.exception.AccessDeniedException.java package com.yourpackage.exception;publicclassAccessDeniedExceptionextendsRuntimeException{publicAccessDeniedException(Stringmessage){super(message);}}继承RuntimeException是为了让他必须是非受检异常不需要再方法上显示throws2. 自定义注解//Target(ElementType.METHOD)Retention(RetentionPolicy.RUNTIME)publicinterfacehasRole{String[]value();//允许的用户类型数组}元注解作用Target指定注解可用的位置(如方法、类、字段等)Retention指定注解保留策略(源码/编译器/运行时)Documented是否包含在JavaDoc中Inherited子类是否继承父类的注解3. AOP面向切面类AspectComponentpublicclassRoleCheckAspect{Around(annotation(hasRole))publicObjectcheckPermission(ProceedingJoinPointjoinPoint,HasRolehasRole)throwsThrowable{// 1. 从 session 获取当前用户WhitelistSettingcurrentUserSessionUtils.getCurrentUserInfo();if(currentUsernull){thrownewRuntimeException(用户未登录请先登录);}// 2. 获取用户的角色ID假设 WhitelistSetting 有 getRoleId() 方法StringuserRoleIdcurrentUser.getRoleId();if(userRoleIdnull||userRoleId.trim().isEmpty()){thrownewRuntimeException(用户角色信息缺失);}// 3. 获取注解中允许的角色列表String[]allowedRoleshasRole.value();if(allowedRolesnull||allowedRoles.length0){thrownewRuntimeException(HasRole 注解必须指定至少一个角色);}// 4. 校验用户角色是否在允许列表中booleanhasAccessArrays.asList(allowedRoles).contains(userRoleId);if(!hasAccess){thrownewRuntimeException(权限不足需要角色 [String.join(, ,allowedRoles)]当前角色为 [userRoleId]);}// 5. 放行returnjoinPoint.proceed();}}4. Controller层使用RestControllerRequestMapping(/api)publicclassDemoController{GetMapping(/admin/data)HasRole({ADMIN,SUPER_ADMIN})publicStringadminData(){return管理员专属数据;}GetMapping(/user/profile)HasRole({USER,ADMIN})publicStringuserProfile(){return用户或管理员可访问;}}统一异常处理和信息返回1. 创建统一信息返回类publicclassRespT{//服务端返回的错误码privateintcode200;//服务端返回的错误信息privateStringmsgsuccess;//我们服务端返回的数据privateTdata;privateResp(intcode,Stringmsg,Tdata){this.codecode;this.msgmsg;this.datadata;}publicstaticTRespsuccess(Tdata){ResprespnewResp(200,success,data);returnresp;}publicstaticTRespsuccess(Stringmsg,Tdata){ResprespnewResp(200,msg,data);returnresp;}publicstaticTResperror(AppExceptionCodeMsgappExceptionCodeMsg){ResprespnewResp(appExceptionCodeMsg.getCode(),appExceptionCodeMsg.getMsg(),null);returnresp;}publicstaticTResperror(intcode,Stringmsg){ResprespnewResp(code,msg,null);returnresp;}publicintgetCode(){returncode;}publicStringgetMsg(){returnmsg;}publicTgetData(){returndata;}}2. 创建全局统一异常处理类ControllerAdvicepublicclassGlobalExceptionHandler{ExceptionHandler(value{Exception.class})ResponseBodypublicTRespTexceptionHandler(Exceptione){//这里先判断拦截到的Exception是不是我们自定义的异常类型if(einstanceofAppException){AppExceptionappException(AppException)e;returnResp.error(appException.getCode(),appException.getMsg());}//如果拦截的异常不是我们自定义的异常(例如数据库主键冲突)returnResp.error(500,服务器端异常);}}3. 创建一个枚举类型//这个枚举类中定义的都是跟业务有关的异常publicenumAppExceptionCodeMsg{INVALID_CODE(10000,验证码无效),USERNAME_NOT_EXISTS(10001,用户名不存在),USER_CREDIT_NOT_ENOUTH(10002,用户积分不足);;privateintcode;privateStringmsg;publicintgetCode(){returncode;}publicStringgetMsg(){returnmsg;}AppExceptionCodeMsg(intcode,Stringmsg){this.codecode;this.msgmsg;}}4. 创建自定义的异常类publicclassAppExceptionextendsRuntimeException{privateintcode500;privateStringmsg服务器异常;publicAppException(AppExceptionCodeMsgappExceptionCodeMsg){super();this.codeappExceptionCodeMsg.getCode();this.msgappExceptionCodeMsg.getMsg();}publicAppException(intcode,Stringmsg){super();this.codecode;this.msgmsg;}publicintgetCode(){returncode;}publicStringgetMsg(){returnmsg;}}拦截器JWT实现登录校验1. 添加依赖dependencies!-- JWT --dependencygroupIdio.jsonwebtoken/groupIdartifactIdjjwt-api/artifactIdversion0.11.5/version/dependencydependencygroupIdio.jsonwebtoken/groupIdartifactIdjjwt-impl/artifactIdversion0.11.5/versionscoperuntime/scope/dependencydependencygroupIdio.jsonwebtoken/groupIdartifactIdjjwt-jackson/artifactIdversion0.11.5/versionscoperuntime/scope/dependency!-- Spring AOP --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-aop/artifactId/dependency!-- Web --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency/dependencies2. JWT工具包packagecom.demo.util;importio.jsonwebtoken.*;importio.jsonwebtoken.security.Keys;importjavax.crypto.SecretKey;importjava.util.Date;importjava.util.HashMap;importjava.util.Map;publicclassJwtUtils{privatestaticfinallongEXPIRE2*60*60*1000;privatestaticfinalSecretKeySECRET_KEYKeys.hmacShaKeyFor(abcdefg1234567890abcdefg1234567890.getBytes());publicstaticStringgenerateToken(LonguserId,Stringrole){MapString,ObjectclaimsnewHashMap();claims.put(role,role);returnJwts.builder().setClaims(claims).setSubject(String.valueOf(userId)).setExpiration(newDate(System.currentTimeMillis()EXPIRE)).signWith(SECRET_KEY).compact();}publicstaticClaimsparseToken(Stringtoken){returnJwts.parserBuilder().setSigningKey(SECRET_KEY).build().parseClaimsJws(token).getBody();}}3. Threadlocal保存用户信息publicclassUserContext{privatestaticfinalThreadLocalLonguserIdHoldernewThreadLocal();privatestaticfinalThreadLocalStringroleHoldernewThreadLocal();publicstaticvoidsetUserId(Longid){userIdHolder.set(id);}publicstaticLonggetUserId(){returnuserIdHolder.get();}publicstaticvoidsetRole(Stringrole){roleHolder.set(role);}publicstaticStringgetRole(){returnroleHolder.get();}publicstaticvoidclear(){userIdHolder.remove();roleHolder.remove();}}4. 拦截器校验登录importorg.springframework.stereotype.Component;importorg.springframework.web.servlet.HandlerInterceptor;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importcom.fasterxml.jackson.databind.ObjectMapper;ComponentpublicclassAuthInterceptorimplementsHandlerInterceptor{OverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{Stringurirequest.getRequestURI();if(uri.equals(/login))returntrue;// 放行登录Stringtokenrequest.getHeader(Authorization);if(tokennull)returnJson(response,401,未登录);else{try{tokentoken.replace(Bearer ,);varclaimsJwtUtils.parseToken(token);UserContext.setUserId(Long.valueOf(claims.getSubject()));UserContext.setRole((String)claims.get(role));returntrue;}catch(Exceptione){returnJson(response,401,Token 无效或过期);returnfalse;}}returnfalse;}privatevoidreturnJson(HttpServletResponseresponse,intcode,Stringmsg)throwsException{response.setContentType(application/json;charsetUTF-8);ObjectMappermappernewObjectMapper();response.getWriter().write(mapper.writeValueAsString(Result.fail(code,msg)));}OverridepublicvoidafterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex){UserContext.clear();}}5. 注册拦截器importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.context.annotation.Configuration;importorg.springframework.web.servlet.config.annotation.InterceptorRegistry;importorg.springframework.web.servlet.config.annotation.WebMvcConfigurer;ConfigurationpublicclassWebConfigimplementsWebMvcConfigurer{AutowiredprivateAuthInterceptorauthInterceptor;OverridepublicvoidaddInterceptors(InterceptorRegistryregistry){registry.addInterceptor(authInterceptor).addPathPatterns(/**);}}6. 自定义注解AOP角色校验importjava.lang.annotation.*;Target(ElementType.METHOD)Retention(RetentionPolicy.RUNTIME)publicinterfaceRequireRole{String[]value();}importorg.aspectj.lang.annotation.*;importorg.aspectj.lang.ProceedingJoinPoint;importorg.aspectj.lang.reflect.MethodSignature;importorg.springframework.stereotype.Component;AspectComponentpublicclassRoleAspect{Around(annotation(RequireRole))publicObjectcheckRole(ProceedingJoinPointjoinPoint)throwsThrowable{MethodSignaturesignature(MethodSignature)joinPoint.getSignature();RequireRoleannotationsignature.getMethod().getAnnotation(RequireRole.class);StringuserRoleUserContext.getRole();for(Stringrole:annotation.value()){if(role.equals(userRole))returnjoinPoint.proceed();}returnResult.fail(403,权限不足);}}7. Controller层示例importorg.springframework.web.bind.annotation.*;importjava.util.Map;RestControllerpublicclassUserController{PostMapping(/login)publicResultMapString,Objectlogin(RequestParamStringusername,RequestParamStringpassword){// 模拟验证LonguserId1L;Stringroleswitch(username){casestudent-student;casecounselor-counselor;caseteacher-teacher;default-student;};StringtokenJwtUtils.createToken(userId,role);MapString,ObjectdataMap.of(token,token,role,role);returnResult.success(data);}RequireRole({student})GetMapping(/list)publicResultStringlist(){returnResult.success(学生可以访问列表);}RequireRole({counselor,teacher})PostMapping(/update)publicResultStringupdate(){returnResult.success(辅导员/老师可以更新);}}
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

asp.net 做网站实例网站开发支持多个币种

Langchain-Chatchat 问答系统灰度阶段客户支持体系建设 在企业数字化转型加速的今天,员工和客户对信息获取的即时性、准确性要求越来越高。尤其是在金融、医疗、法律等高合规性行业,知识分散、响应滞后、数据外泄风险等问题长期困扰着客户支持体系的建设…

张小明 2026/1/7 23:01:46 网站建设

网站建设报价 下载举报不良网站信息怎么做

绝区零全自动战斗终极指南:零门槛智能辅助工具完整攻略 【免费下载链接】ZenlessZoneZero-OneDragon 绝区零 一条龙 | 全自动 | 自动闪避 | 自动每日 | 自动空洞 | 支持手柄 项目地址: https://gitcode.com/gh_mirrors/ze/ZenlessZoneZero-OneDragon 你是否也…

张小明 2026/1/7 23:01:51 网站建设

个人建设图片分享网站wordpress模板首页

Linly-Talker支持SRT字幕输出,无障碍传播更进一步 在数字内容爆炸式增长的今天,信息是否真正“触达”每一位用户,正成为衡量技术价值的新标尺。尤其是在短视频、在线教育和智能客服等场景中,一个看似简单的字幕功能,往…

张小明 2026/1/7 23:01:49 网站建设

手机端企业网站源码偏门项目网

第一章:R Shiny模块热加载技术概述在构建复杂的R Shiny应用时,随着功能模块的不断扩展,传统的单文件架构逐渐暴露出开发效率低、维护困难等问题。模块化编程通过将UI与服务器逻辑拆分为独立单元,显著提升了代码的可读性和复用性。…

张小明 2026/1/7 23:01:52 网站建设

乐陵seo推广上海做网站优化

智慧树刷课终极指南:5分钟掌握高效学习插件 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 还在为智慧树网课的漫长播放时间而烦恼吗?想要在不影…

张小明 2026/1/7 23:01:51 网站建设

哪建设网站个人主页网站模板

第一章:智谱Open-AutoGLM下载 Open-AutoGLM 是由智谱AI推出的一款面向自动化代码生成与自然语言任务处理的开源大模型工具包,支持本地部署与二次开发。用户可通过官方渠道获取源码并快速搭建运行环境。 环境准备 在下载 Open-AutoGLM 之前,需…

张小明 2026/1/7 23:01:52 网站建设