分布式会话拦截器

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();
            }
        }
    }
相关推荐
BD_Marathon16 小时前
【Zookeeper】CAP理论——CAP介绍
linux·分布式·zookeeper
j***576818 小时前
【分布式文件存储系统Minio】2024.12保姆级教程
分布式
敲上瘾19 小时前
【探索实战】:Kurator分布式统一应用分发平台的全面解析与实践指南
分布式·容器·kubernetes·serverless
SuperHeroWu72 天前
【HarmonyOS 6】UIAbility跨设备连接详解(分布式软总线运用)
分布式·华为·harmonyos·鸿蒙·连接·分布式协同·跨设备链接
杜子不疼.2 天前
【探索实战】从0到1打造分布式云原生平台:Kurator全栈实践指南
分布式·云原生
m***l1152 天前
集成RabbitMQ+MQ常用操作
分布式·rabbitmq
拾忆,想起2 天前
Dubbo分组(Group)使用指南:实现服务接口的多版本管理与环境隔离
分布式·微服务·性能优化·架构·dubbo
回家路上绕了弯2 天前
彻底解决超卖问题:从单体到分布式的全场景技术方案
分布式·后端
拾忆,想起2 天前
Dubbo动态配置实时生效全攻略:零停机实现配置热更新
分布式·微服务·性能优化·架构·dubbo
每天进步一点_JL2 天前
事务与消息中间件:分布式系统中的可见性边界问题
分布式·后端