分布式会话拦截器

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();
            }
        }
    }
相关推荐
小宋102138 分钟前
玩转RabbitMQ声明队列交换机、消息转换器
服务器·分布式·rabbitmq
懒洋洋的华3696 小时前
消息队列-Kafka(概念篇)
分布式·中间件·kafka
March€7 小时前
分布式事务的基本实现
分布式
DieSnowK8 小时前
[Redis][环境配置]详细讲解
数据库·redis·分布式·缓存·环境配置·新手向·详细讲解
Lill_bin9 小时前
深入理解ElasticSearch集群:架构、高可用性与数据一致性
大数据·分布式·elasticsearch·搜索引擎·zookeeper·架构·全文检索
qingcyb16 小时前
下载Kafka 3.0.0教程
分布式·kafka
杰信步迈入C++之路18 小时前
【RabbitMQ】快速上手
分布式·rabbitmq·ruby
妙龄少女郭德纲21 小时前
基于Spark框架实现XGBoost模型
大数据·分布式·spark
晚枫200021 小时前
kafka发送事件的几种方式
spring boot·分布式·docker·容器·kafka·intellij-idea·linq
二进制杯莫停21 小时前
初识zookeeper
分布式·zookeeper·云原生