SpringMVC过滤器Filter与拦截器Interceptor

Posted The Gao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringMVC过滤器Filter与拦截器Interceptor相关的知识,希望对你有一定的参考价值。

过滤器

JavaWeb工程中的重要组成单元之一。通过构建一个继承Filter接口的实体类,重写其中的init()方法、doFilter()方法、destroy()方法实现。重写的三个方法中,doFilter()方法是最重要的,它描述了拦截时的逻辑。

//实体类
public class TransactionFilter implements Filter 
    @Override
    public void init(FilterConfig filterConfig) throws ServletException 

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException 
        try 
            filterChain.doFilter(servletRequest,servletResponse);
         catch (Exception e) 
            throw new RuntimeException(e);
        
    

    @Override
    public void destroy() 

需要将这个实体类配置到web.xml中。

<!--配置-->
<filter>
    <filter-name>TransactionFilter</filter-name>
    <filter-class>com.gzh.filter.TransactionFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>TransactionFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

拦截器

只有使用了SpringMVC框架的工程才能使用拦截器,因此拦截器就有了过滤器没有的特性。拦截器是基于Spring框架的AOP思想

拦截器只会拦截访问的控制器方法, 如果访问的是静态资源是不会进行拦截的。

需要编写一个实体类继承HandlerInterceptor接口。

public class MyInterceptor implements HandlerInterceptor 

   //在请求处理的方法之前执行
   //返回true执行下一个拦截器,返回false就卡在当前拦截器
   public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception 
       System.out.println("处理前");
       return true;
  

   //在请求处理方法执行之后执行
   public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception 
       System.out.println("处理后");
  

   //在dispatcherServlet处理后执行,做清理工作
   public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception 
       System.out.println("清理");
  

需要在SpringMVC的配置文件中配置拦截器。注意这里的/** 包括路径及其子路径,如/admin/*拦截的是/admin/add/admin/add/user不会被拦截;而/admin/**拦截的是/admin/下的所有文件。

<mvc:interceptors>
	<!--可以配置多个拦截器-->
   <mvc:interceptor>
       <mvc:mapping path="/**"/>
       <bean class="com.gzh.interceptor.MyInterceptor"/>
   </mvc:interceptor>
</mvc:interceptors>

以上是关于SpringMVC过滤器Filter与拦截器Interceptor的主要内容,如果未能解决你的问题,请参考以下文章

springboot下的Filter过滤器;springmvc的HandlerInterceptorAdapter拦截器

过滤器(Filter)和拦截器(Interceptor)的执行顺序和区别

SpringMVC拦截器的简单使用

SpringMVC拦截器的简单使用

springmvc拦截器

SpringMVC08:拦截器+文件上传下载