分布式会话拦截器

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();
            }
        }
    }
相关推荐
努力的小郑2 天前
从一次分表实践谈起:我们真的需要复杂的分布式ID吗?
分布式·后端·面试
AAA修煤气灶刘哥2 天前
别让Redis「歪脖子」!一次搞定数据倾斜与请求倾斜的捉妖记
redis·分布式·后端
Aomnitrix3 天前
知识管理新范式——cpolar+Wiki.js打造企业级分布式知识库
开发语言·javascript·分布式
程序消消乐3 天前
Kafka 入门指南:从 0 到 1 构建你的 Kafka 知识基础入门体系
分布式·kafka
智能化咨询3 天前
Kafka架构:构建高吞吐量分布式消息系统的艺术——进阶优化与行业实践
分布式·架构·kafka
Chasing__Dreams3 天前
kafka--基础知识点--5.2--最多一次、至少一次、精确一次
分布式·kafka
在未来等你3 天前
Elasticsearch面试精讲 Day 17:查询性能调优实践
大数据·分布式·elasticsearch·搜索引擎·面试
大数据CLUB3 天前
基于spark的澳洲光伏发电站选址预测
大数据·hadoop·分布式·数据分析·spark·数据开发
ajax_beijing3 天前
zookeeper是啥
分布式·zookeeper·云原生