SpringMVC基于注解使用:拦截器

80 阅读2分钟

1、SpringMVC拦截器
Spring拦截器采用AOP设计思想 和过滤器类似 用来拦截处理方法在之前之后执行的一些跟主要业务没有关系的公共功能。


比如:可以实现 权限验证 日志 异常记录 记录方法执行时间等


自定义拦截器必须实现HandlerInterceptor接口

preHandle 方法执行前拦截

postHandle 方法执行后视图没有渲染完拦截

afterCompletion 方法执行后拦截

SpringMVC拦截器使用

1、创建拦截器 实现 HandlerInterceptor 接口

public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("------------方法前执行------------preHandle");
        return true;
    }
    @Override
    public  void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,   @Nullable ModelAndView modelAndView) throws Exception {
        System.out.println("方法后渲染前-----------postHandle");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,  @Nullable Exception ex) throws Exception {
        System.out.println("在渲染后-----afterCompletion");
    }
}

2、springmvc.xml配置文件注册

<mvc:interceptors>
    <bean class="com.kdy.interceptor.MyInterceptor" id="interceptor"></bean>
</mvc:interceptors>

3、运行使用


拦截器的三个方法及用途

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    System.out.println("------------方法前执行------------preHandle");

    //System.out.println(handler);
    HandlerMethod handlerMethod = (HandlerMethod)handler;
    String methodName = handlerMethod.getMethod().getName();
    String className = handlerMethod.getBean().getClass().getName();

    System.out.println("类名:"+className+";方法名:"+methodName);
    Parameter[] parameters = handlerMethod.getMethod().getParameters();
    System.out.println(Arrays.asList(parameters));


    return true;
}
//当处理方法出现异常 这个不会执行
@Override
public  void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,   @Nullable ModelAndView modelAndView) throws Exception {
    System.out.println("方法后渲染前-----------postHandle");
}


@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,  @Nullable Exception ex) throws Exception {
    System.out.println(ex.getMessage());
    //关闭资源等操作
    System.out.println("在渲染后-----afterCompletion");
}

过滤器和拦截器

过滤器执行后 拦截器再执行

image.png

image.png

自定义过滤器

@WebFilter("/*")
public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("过滤器前");
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("过滤器后");
    }

    @Override
    public void destroy() {

    }
}

拦截器跟过滤器的区别

1、过滤器是基于函数回调的 拦截器是基于java反射的

2、过滤器依赖servlet容器 拦截器不依赖servlet容器

3、过滤器几乎对所有的请求都起作用 拦截器只能对SpringMVC请求起作用

4、拦截器可以访问action的上下文 过滤器不可以