1.分布式会话拦截器-构建拦截器
背景:对于不同的用户进行权限拦截(基于token的判断)
实现过程:在api下构建包以及相关的文件,创建UserTokenInterceptor,实现implements handlerInterceptor.重写三种主要方法。 preHandle postHandle afterCompletion
然后将Interceptor放入容器中:
实现方式,重写WebMvcConfigurer,Bean装配UserTokenInterceptor,然后重写addInterceptors()方法。
public UserTokenInterceptor userTokenInterceptor(){
return new UserTokenInterceptor();
}
/**
* 注册拦截器
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(userTokenInterceptor())
.addPathPatterns("/hello");
WebMvcConfigurer.super.addInterceptors(registry);
}
2.分布式会话拦截器-会话判断
根据用户信息处理拦截业务。能不能根据用户的id拿到用户的token,当此token与前端传过来的token匹配,代表当前的操作就是当前的发起人,认证通过;否则就拒绝。
代码思路:拦截器中获取前端传过来的数据(需要与前端约定数据传过来的方式。)
(注意:拦截器中的数据与业务是需要区分开的,一般放到headers里面去做验证,而不是放到userInfoMore里面去传到后端,这样做是为了降低耦合度)
代码示例:
代码:
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// System.out.println("进入拦截器,请求已经被拦截...");
String userId = request.getHeader("headerUserId");
String userToken =request.getHeader("headerUserToken");
if (StringUtils.isNoneBlank(userId)&&StringUtils.isNoneBlank(userToken)){
String uniqueToken =redisOperator.get(REDIS_USER_TOKEN+":"+userId);
if (StringUtils.isBlank(uniqueToken)){
logger.info("redis数据库中token数据查询不到");
return false;
}else {
if (!uniqueToken.equals(userToken)){
System.out.println("账号在异地登录");
return false;
}
}
}else {
logger.info("用户信息为空,请重新登录");
return false;
}
/**
* false:请求被拦截,被驳回,验证出现问题
* true:请求在经过验证校验以后是可以放行的
*/
return false;
}
3.分布式会话拦截器3-错误返回
代码示例:
//处理错误信息返回前端
public void returnErrorResponse(HttpServletResponse response,
JSONResult result){
OutputStream out = null;
try {
response.setCharacterEncoding("utf-8");
response.setContentType("text/json");
out = response.getOutputStream();
//byte转成json数据
out.write(JsonUtils.objectToJson(result).getBytes("utf-8"));
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if (out != null){
out.close();
}
}catch (IOException e) {
e.printStackTrace();
}
}
}