分布式会话拦截器

1.分布式会话拦截器-构建拦截器

背景:对于不同的用户进行权限拦截(基于token的判断)

实现过程:在api下构建包以及相关的文件,创建UserTokenInterceptor,实现implements handlerInterceptor.重写三种主要方法。 preHandle postHandle afterCompletion

然后将Interceptor放入容器中:

实现方式,重写WebMvcConfigurer,Bean装配UserTokenInterceptor,然后重写addInterceptors()方法。

java 复制代码
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里面去传到后端,这样做是为了降低耦合度)

代码示例:

代码:

java 复制代码
@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-错误返回

代码示例:

java 复制代码
//处理错误信息返回前端
    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();
            }
        }
    }
相关推荐
机器觉醒时代6 小时前
定义下一代机器人训练?智元 SOP:VLA 模型真实世界分布式在线后训练的关键突破
分布式·机器人·ai大模型·人形机器人
Honmaple6 小时前
SpringBoot + Seata + Nacos:分布式事务落地实战,订单-库存一致性全解析
spring boot·分布式·后端
阳宗德6 小时前
分布式解决方案:从痛点拆解到思路落地
分布式
2501_941805936 小时前
面向高可用微服务体系的状态管理演进与多语言实现经验融合实践分享文章
java·大数据·分布式
rchmin7 小时前
分布式ID生成方法详解
分布式
笃行客从不躺平7 小时前
分布式事务核心原理与主流模型学习
分布式
Overt0p8 小时前
MQ简单介绍以及RabbitMQ基础使用,快速上手
java·分布式·rabbitmq
无限大.8 小时前
为什么“缓存“能提高系统性能?——从 CPU 缓存到分布式缓存
分布式·缓存
迪迦不喝可乐8 小时前
Kafka
分布式·kafka
心态还需努力呀8 小时前
从单体到分布式:一套 Pulsar 驱动的 AI Infra 实战框架
人工智能·分布式