Spring Boot 复习之拦截器的使用

211 阅读1分钟

在原生Servlet开发中,经常使用过滤器filter来过滤web请求。在Spring boot中,我们可以通过拦截器HandlerInterceptor来过略web请求。HandlerInterceptor 的功能跟过滤器类似,但是提供更精细的的控制能力,可以针对Controller控制器中某些请求精准过滤,而不是拦截Servlet容器

主要步骤为

创建自定义的拦截器并实现HandlerInterceptor接口

@Component
public class IntercpterLogin implements HandlerInterceptor {
    private static final Logger log = LoggerFactory.getLogger(IntercpterLogin.class);
    /**
     * redis
     *
     * */
    @Autowired
    RedisTemplate redisTemplate;
    /**
     *  token ,用户登录标识
     * */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse res, Object o) throws Exception {
        String token = request.getHeader("token");
        res.setContentType("application/json;charset=utf-8");
        if(token == null){
            Response response = new Response();
            response.setMessage("没有携带登录密钥");
            response.setCode(0);
            res.getWriter().write(JSONObject.toJSONString(response));
            return false;
  
        }

        Claims clams =  JWT.intance().parseJWT(token);
        if(clams != null) {
            JSONObject userInfo = JSONObject.parseObject(clams.getSubject());
            User user = new User();
            user.setStatus(userInfo.getString("status"));
            user.setUsername(userInfo.getString("name"));
            user.setUserid(Integer.parseInt(userInfo.getString("uid")));
            UserContextUtil.addUser(user);
            return true;
        }else{
            Response response = new Response();
            response.setMessage("登录过期");
            response.setCode(0);
            res.getWriter().write(JSONObject.toJSONString(response));
            return false;
        }
//注意,只有返回true才会继续向下执行,返回false则取消当前请求
    }

    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
        UserContextUtil.clear();
    }
}

创建一个类继承WebMvcConfigurerAdapter,并重写 addInterceptors 方法,将想要拦截的页面写进去。

@Configuration
public class LoginConfiguration implements WebMvcConfigurer {

    /**添加拦截器*/
    @Bean
    public IntercpterLogin loginInterceptor(){
        return new IntercpterLogin();
    }

    /**
     * 配置请求拦截器
     * */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        List<String> interceptorSet = new ArrayList<>();
        //需要拦截的
        interceptorSet.add("/user/**");
        interceptorSet.add("/redirectlogin");
        List<String> passSet = new ArrayList<>();
        //passset里面是对不需要拦截的方法集合
        passSet.add("/registe");
        passSet.add("/login");

        //拦截所有请求
        registry.addInterceptor(loginInterceptor()).addPathPatterns(interceptorSet).excludePathPatterns(passSet);

    }

    /**
     * 方法级别的单个参数验证开启
     */
    @Bean
    public MethodValidationPostProcessor methodValidationPostProcessor() {
        return new MethodValidationPostProcessor();
    }

}