首页 > 编程语言 > 详细

分布式会话 spring boot 拦截器

时间:2021-09-02 14:29:19      阅读:14      评论:0      收藏:0      [点我收藏+]
  • 实现 HandlerInterceptor 接口,编写拦截器
package com.jinsh.controller.Interceptor;

import com.jinsh.utils.JSONResult;
import com.jinsh.utils.JsonUtils;
import com.jinsh.utils.RedisOperator;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;

public class UserTokenInterceptor implements HandlerInterceptor {

    @Autowired
    private RedisOperator redisOperator;

    public static final String REDIS_USER_TOKEN = "redis_user_token";

    /**
     * 拦截请求,在访问controller调用之前
     * @param request
     * @param response
     * @param handler
     * @return false:请求被拦截;true:放行
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String userId = request.getHeader("headerUserId");
        String userToken = request.getHeader("headerUserToken");
        String errorMsg = "";
        if (StringUtils.isNotBlank(userId) && StringUtils.isNotBlank(userToken)) {
            String userUniqueToken = redisOperator.get(REDIS_USER_TOKEN + ":" + userId);
            if (StringUtils.isBlank(userUniqueToken)) {
                errorMsg = "账号未登录!";
            } else if (!userUniqueToken.equals(userToken)) {
                errorMsg = "账号异地登陆!";
            } else {
                return true;
            }
        } else {
            errorMsg = "账号未登录!";
        }
        returnErrorResponse(response, JSONResult.errorMsg(errorMsg));
        return false;
    }

    private void returnErrorResponse(HttpServletResponse response, JSONResult jsonResult) {
        OutputStream out = null;
        try {
            response.setCharacterEncoding("utf-8");
            response.setContentType("text/json");
            out = response.getOutputStream();
            out.write(JsonUtils.objectToJson(jsonResult).getBytes("utf-8"));
            out.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 请求controller之后,渲染视图之前
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    /**
     * 请求controller之后,渲染视图之后
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}
  • WebMvcConfig中配置拦截器
package com.jinsh.config;

import com.jinsh.controller.Interceptor.UserTokenInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    
    @Bean
    public UserTokenInterceptor userTokenInterceptor() {
        return new UserTokenInterceptor();
    }

    /**
     * 添加拦截器
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(userTokenInterceptor())
                .addPathPatterns("/hello")
                .addPathPatterns("/userInfo/*")
                .excludePathPatterns("/hello2") // 剔除不拦截
                .excludePathPatterns("/orders/notifyMerchantOrderPaid"); // 剔除不拦截
        WebMvcConfigurer.super.addInterceptors(registry);
    }
}

分布式会话 spring boot 拦截器

原文:https://www.cnblogs.com/jinshengnianhua/p/15217077.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!