美文网首页java专题
springMvc拦截器无法注入的问题

springMvc拦截器无法注入的问题

作者: H_Man | 来源:发表于2018-11-09 12:08 被阅读4次

使用springmvc的拦截器做一些登陆信息或者是权限校验。

1.使用

需要实现HandlerInterceptor接口,按照自己的需求重写相应的方法,不用特意声明spring bean

public interface HandlerInterceptor {

    /**
     * 该方法在请求处理之前进行调用。SpringMVC 中的 Interceptor 是链式调用的,在一个应用中或者说是在一个请求中可以同时存在多个 Interceptor 。
     * 每个 Interceptor 的调用会依据它的声明顺序依次执行,而且最先执行的都是 Interceptor 中的 preHandle 方法,所以可以在这个方法中进行一些前置初始化操作或者是对当前请求做一个预处理,
     * 也可以在这个方法中进行一些判断来决定请求是否要继续进行下去。该方法的返回值是布尔值 Boolean 类型的,当它返回为 false 时,表示请求结束,后续的 Interceptor 和 Controller 都不会再执行;
     * 当返回值为 true 时,就会继续调用下一个 Interceptor 的 preHandle 方法,如果已经是最后一个 Interceptor 的时候,就会是调用当前请求的 Controller 中的方法。
     */
    default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {

        return true;
    }

    /**
     * postHandle 方法在当前请求进行处理之后,也就是在 Controller 中的方法调用之后执行,但是它会在 DispatcherServlet 进行视图返回渲染之前被调用,
     * 所以咱们可以在这个方法中对 Controller 处理之后的 ModelAndView 对象进行操作。postHandle 方法被调用的方向跟 preHandle 是相反的,也就是说,
     * 先声明的 Interceptor 的 postHandle 方法反而会后执行。
     */
    default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            @Nullable ModelAndView modelAndView) throws Exception {
    }

    /**
     * 也是需要当前对应的 Interceptor 的 preHandle 方法的返回值为 true 时才会执行。
     * 因此,该方法将在整个请求结束之后,也就是在 DispatcherServlet 渲染了对应的视图之后执行,这个方法的主要作用是用于进行资源清理的工作。
     */
    default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
            @Nullable Exception ex) throws Exception {
    }

}
2. 注册拦截器

springMvc提供了WebMvcConfigurer接口用来注册拦截器

  • 实现接口;
  • 重写addInterceptors方法
/**
 * @author: hman
 * @date 2018-11-02
 * @desc: 配置
 */
@Component
public class WebConfig implements WebMvcConfigurer {


  @Override
  public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new LogInterceptor());
    registry.addInterceptor(new AuthorizationInterceptor());
  }
}
3. 出现的问题

拦截器中无法自动注入spring bean,autowired的对象是null

4. 解决方案

使用WebApplicationContextUtils直接获取bean

org.springframework.web.context.support.WebApplicationContextUtils
          .getRequiredWebApplicationContext(request.getServletContext())
          .getBean(T.class);

相关文章

网友评论

    本文标题:springMvc拦截器无法注入的问题

    本文链接:https://www.haomeiwen.com/subject/ljnnxqtx.html