详解Java拦截器以及自定义注解的使用
更新时间:2022年01月10日 08:46:14 作者:李三岁yep
这篇文章主要为大家介绍了Java拦截器以及自定义注解的使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助<BR>
1,设置预处理,设置不需要拦截的请求
@Component public class MyWebConfig implements WebMvcConfigurer { private final UserTokenInterceptor userTokenInterceptor; private final SecurityInterceptor securityInterceptor; public MyWebConfig( UserTokenInterceptor userTokenInterceptor, SecurityInterceptor securityInterceptor) { this.userTokenInterceptor = userTokenInterceptor; this.securityInterceptor = securityInterceptor; } @Override public void addInterceptors(InterceptorRegistry registry) { // 定义排除swagger访问的路径配置 String[] swaggerExcludes = new String[] {"/swagger-ui.html", "/swagger-resources/**", "/webjars/**"}; registry .addInterceptor(userTokenInterceptor) .addPathPatterns("/**") .excludePathPatterns( "/user/login", "/static/**", "/*.html", "/*.ico", "/*.json", "/*.png", "/heartbeat/**") .excludePathPatterns(swaggerExcludes); registry .addInterceptor(securityInterceptor) .addPathPatterns("/maintain/**", "/user/**") .excludePathPatterns("/user/login"); } }
2.UserTokenInterceptor ,securityInterceptor分别处理不同的请求拦截,执行不同的拦截逻辑。
2个处理的类请求上可以有交集,2个处理类都执行。
@Component public class UserTokenInterceptor implements HandlerInterceptor { private final EmpInfoService empInfoService; public UserTokenInterceptor(EmpInfoService empInfoService) { this.empInfoService = empInfoService; } @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 校验handler是否是HandlerMethod if (!(handler instanceof HandlerMethod)) { return true; } // 从请求头中获取token String token = request.getHeader("Authorization"); /** * update:2021/11/30 ShengJieLi * 增加逻辑:Authorization的值不为本系统生成的token时,解密Authorization,获取token并验证 */ if (StrUtil.isNotEmpty(token)) { EmpInfo securityEmployee = empInfoService.queryToken(token); if(securityEmployee != null){ // token有效 String ref = empInfoService.isRef(token); if (StrUtil.isNotBlank(ref)) { response.setHeader("Access-Control-Expose-Headers", "token"); response.addHeader("token", ref); } }else{ //Authorization为PBE加密数据 securityEmployee = empInfoService.analyticQueryToken(token,response); } if (securityEmployee != null) { // token有效 // 将User对象放入到ThreadLocal中 UserLocal.set(securityEmployee); return true; } return false; } // String s = JSONUtil.toJsonStr(ResponseResult.error(ErrorCode.TOKEN_ERROR)); // response.setContentType("text/html;charset=UTF-8"); // JSONUtil.toJsonStr(s, response.getWriter()); // response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); InterceptorExceptionResolver.interceptorError(response,ErrorCode.TOKEN_ERROR); //update 结束 return false; } @Override public void afterCompletion( HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // 响应结束后刪除對象 UserLocal.remove(); } }
@SecurityGrade({"SUPER_ADMIN", "SYSTEM_ADMIN"}) public class SecurityController { private final EmpInfoService empInfoService; public SecurityController(EmpInfoService empInfoService) { this.empInfoService = empInfoService; } @GetMapping("getUserInformation") @ApiOperation("登陸用户信息") @NoAuthorization public ResponseResult getUserInformation(@ApiIgnore HttpServletResponse response) { return empInfoService.getUserInformation(response); } }
3.关于注解的使用
@SecurityGrade({"SUPER_ADMIN", "SYSTEM_ADMIN"}) public class SecurityController { private final EmpInfoService empInfoService; public SecurityController(EmpInfoService empInfoService) { this.empInfoService = empInfoService; } @GetMapping("getUserInformation") @ApiOperation("登陸用户信息") @NoAuthorization public ResponseResult getUserInformation(@ApiIgnore HttpServletResponse response) { return empInfoService.getUserInformation(response); } }
method.getMethodAnnotation(SecurityGrade.class)
获得注解信息,methodAnnotation.value()
获得注解内容"SUPER_ADMIN",
"SYSTEM_ADMIN"。
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!
相关文章
springboot使用Hutool的JschUtil及下载安装步骤
这篇文章主要为大家介绍了springboot使用Hutool的JschUtil的方法及下载安装详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2022-08-08java如何通过FileOutputStream字节流向文件中写数据
这篇文章主要介绍了java如何通过FileOutputStream字节流向文件中写数据问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2022-12-12Spring框架中ImportBeanDefinitionRegistrar的应用详解
这篇文章主要介绍了Spring框架中ImportBeanDefinitionRegistrar的应用详解,如果实现了ImportSelector接口,在配置类中被@Import加入到Spring容器中以后,Spring容器就会把ImportSelector接口方法返回的字符串数组中的类new出来对象然后放到工厂中去,需要的朋友可以参考下2024-01-01
最新评论