SpringBoot拦截器

拦截器的实现类

​ 在编写一个拦截器的类的时候需要实现HandlerInterceptor接口

HandlerInterceptor接口方法如下:

    boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception;

    void postHandle(
            HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
            throws Exception;

    void afterCompletion(
            HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception;
  • preHandler:业务处理器处理请求之前被调用,对用户的request进行处理,若返回值为true,则继续调用后续的拦截器和目标方法;若返回值为false,则终止请求;这里可以加上登录校验,权限拦截等。
  • postHandler:Controller执行后但未返回视图前调用该方法,这里可以对返回用户前的模型数据进行加工处理。
  • afterCompletion:Controller执行后且返回视图后调用,可以得到Controller时的异常信息,这里可以记录操作日志,资源清理等。

实现注册拦截

这里我是重写的preHandler方法,用来登录拦截的。具体代码实现如下

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //获取request作用域中的token
        String token = request.getHeader("token");
        if (token == null) {
            token = request.getParameter("token");
        }
        if (token != null) {
            //解密token
            Claims claims = JwtUtils.checkJWT(token);
            if (claims != null) {
                //获取解密后的信息
                Integer userId = (Integer) claims.get("id");
                String name = (String) claims.get("name");
                request.setAttribute("user_id",userId);
                request.setAttribute("name",name);
                return true;
            }
        }
        return false;
    }

在这,返回的无非就是一个true或false,所以中间我写的是我的业务逻辑代码,也就是通过获取token来判断用户是否登录,若未登录,则返回false,终止该请求。

将拦截器加入到MVC中

在SpringBoot 2.0以上, WebMvcConfigurerAdapter已过时,但是WebMvcConfigurerAdapter实际上是WebMvcConfigurer接口的空实现类。故有两种方法可以实现:推荐使用:implements WebMvcConfigurer

方法有如下几种:

1. @EnableWebMvc + implements WebMvcConfigurer
在扩展类中重写父类的方法即可,这种方法会屏蔽springboot对SpringMVC的自动配置。
2. implements WebMvcConfigurer
在扩展类中重写父类的方法即可,这种方法会使用springboot对SpringMVC的自动配置。
3. extends WebMvcConfigurationSupport
在扩展类中重写父类的方法即可,这种方法会屏蔽springboot对SpringMVC的自动配置。

接下来就是需要将拦截器加入到MVC中,也就是配置刚刚创建的拦截器,我们创建一个类,加上@Configuration这个注解并且实现WebMvcConfigurer这个接口

然后重写addInterceptors这个方法把我们刚刚创建的拦截器配置好路径后添加到MVC中即可。

具体实现如下:

@Configuration
public class IntercepterConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //注册拦截器 并配置拦截路径
        registry.addInterceptor(new LoginIntercepter()).addPathPatterns("/user/api/v1/*/**");
        //添加拦截器
        WebMvcConfigurer.super.addInterceptors(registry);
    }
}
posted @ 2019-10-27 14:02  安徒生的笔  阅读(728)  评论(0编辑  收藏  举报