一、先编写一个拦截器
这里加了JWT用于登录鉴权使用,可以按照自己的需求选择怎么写中间的业务
/**
* 拦截器
*
* @author xusj
* <br>CreateDate 2022/6/6 15:18
*/
@Slf4j
public class AuthInterceptor implements HandlerInterceptor {
@Resource
private RedisCache redisService;
@Resource
private HostHolder hostHolder;
// 请求拦截要干嘛?
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
// 校验请求头
log.info("请求拦截====>{}", request.getRequestURI());
String accessToken = request.getHeader("Authorization");
if (StringUtils.isEmpty(accessToken)) {
throw new ServiceException(LoginEnum.AUTH_FAIL);
}
// 解析JWT,解析失败异常。获取请求头中的信息
AccToken accToken = JwtTokenUtils.parseToken(accessToken);
// 判断是否过期
String accessTokenRedis = (String) redisService.getCacheObject(RedisConstants.USER_TOKEN_INFORMATION_AUTH + accToken.getUserId() + accToken.getUserAccount() + accToken.getSiteId());
if (StringUtils.isEmpty(accessTokenRedis)) {
throw new ServiceException(LoginEnum.LOGIN_EXPIRED);
}
// TODO XUSJ 放userId和siteId到请求头中,便于后面使用
// 将token解码后的数据存入当前线程的ThreadLocalMap中
hostHolder.setUser(accToken);
log.info("=========当前threadLocal中的参数{}=========", JSON.toJSONString(accToken));
return true;
}
// 请求结束后要干嘛
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// 请求结束,将保存的信息清除
hostHolder.clear();
}
}
二、写拦截器的配置类,将拦截器注册到容器中
- 1、注册到容器中
- 2、选择拦截的url和需要泛型url
/**
* 将拦截器注册到容器中
*
* @author xusj
* <br>CreateDate 2022/8/17 16:34
*/
@Configuration
@Slf4j
public class WebUserConfig implements WebMvcConfigurer {
@Bean
public AuthInterceptor authInterceptor() {
return new AuthInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 注册TestInterceptor拦截器
InterceptorRegistration registration = registry.addInterceptor(authInterceptor());
//所有路径都被拦截
registration.addPathPatterns("/**");
//添加不拦截路径
registration.excludePathPatterns(
"/**/*.html",
//js静态资源
"/**/*.js",
//css静态资源
"/**/*.css",
"/**/*.woff",
"/**/*.ttf",
// swagger相关接口
"/swagger-resources/**", "/webjars/**", "/v2/**", "/swagger-ui.html/**", "/error",
"/", "/csrf",
// 登录相关接口
"/webUser/selectLoginWebSite",
"/webUser/login",
// c端相关接口全部放行
"/client/**"
);
}
}
三、浅谈拦截器
1~4点截取自网络博文
1,拦截器的概念
java里的拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action
执行前阻止其执行,同时也提供了一种可以提取Action中可重用部分代码的方式。在AOP中,拦截器用于在某个方法或者字段被访问之前,进行拦截
然后再之前或者之后加入某些操作。目前,我们需要掌握的主要是Spring的拦截器,Struts2的拦截器不用深究,知道即可。
2,拦截器的原理
大部分时候,拦截器方法都是通过代理的方式来调用的。Struts2的拦截器实现相对简单。当请求到达Struts2的ServletDispatcher时,Struts2
会查找配置文件,并根据配置实例化相对的拦截器对象,然后串成一个列表(List),最后一个一个的调用列表中的拦截器。Struts2的拦截器是可
插拔的,拦截器是AOP的一个实现。Struts2拦截器栈就是将拦截器按一定的顺序连接成一条链。在访问被拦截的方法或者字段时,Struts2拦截器链
中的拦截器就会按照之前定义的顺序进行调用。
3,自定义拦截器的步骤
第一步:自定义一个实现了Interceptor接口的类,或者继承抽象类AbstractInterceptor。
第二步:在配置文件中注册定义的拦截器。
第三步:在需要使用Action中引用上述定义的拦截器,为了方便也可以将拦截器定义为默认的拦截器,这样在不加特殊说明的情况下,所有的
Action都被这个拦截器拦截。
4、
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/96201.html