Java Servlet 过滤器与 SpringMVC 拦截器的区别?(3)

<mvc:interceptors>
        <!--  使用bean定义一个Interceptor,直接定义在mvc:interceptors根下面的Interceptor将拦截所有的请求  -->
        <!-- <bean/> -->

<mvc:interceptor>
            <!--进行拦截的地址-->
            <mvc:mapping path="/**"/>
            <bean/>
        </mvc:interceptor>

</mvc:interceptors>

  Java 代码

package com.yule.common.interceptors;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 自定义拦截器方式一
 * Created by yule on 2018/7/2 22:37.
 */
public class DemoInterceptor implements HandlerInterceptor{
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
        //return true 表示继续下一个拦截器或者 control 层
        //return false 表示被拦截下来
        return 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 {

}
}

按 Ctrl+C
package com.yule.common.interceptors;

import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 自定义拦截器方式二
 * 一般都是通过实现HandlerInterceptor接口或者继承HandlerInterceptorAdapter抽象类,复写preHandle()、postHandle()和afterCompletion()这 3 个方法来对用户的请求进行拦截处理
 * Created by yule on 2018/7/2 22:43.
 */
public class Demo2Interceptor extends HandlerInterceptorAdapter {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return true;
    }
}
按 Ctrl+C

区别

  其实两者还是有相似之处,就是都可以用作权限检查、日志记录等情况,但是在这些情况下如何选择就要知道不同之处。

不同之处

  使用范围不同:Filter 只能用于 Web 程序中。而拦截器可以用于 Web 程序,Application、Swing 程序中。

  规范不同:Filter 是 servlet 规范规定的,是 servlet 支持的。而拦截器是在 spring 容器内,是 spring 框架支持的。

  使用资源不同:Filter 不能直接使用 spring 的资源、对象等。而拦截器是一个 spring 组件,归 spring 管理,配置在 spring 文件中,因此能使用 spring 的任何资源、对象,例如 Service 对象、数据源、事务管理等,通过 IoC 注入到拦截器即可。也就是说在拦截器中可以注入一个 service ,用于业务逻辑或者访问数据库。

  深度不同:Filter 只在 Servlet 前后起作用。而拦截器能够深入到方法前后、异常抛出前后等,因此拦截器的使用具有更大的弹性。

  作用范围不同:拦截器只能对 Controller 层请求起作用,而过滤器则可以对几乎所有的请求起作用(如 .js、.css等)。

  所以,在 Spring 构架的程序中,要优先使用拦截器。

注意

  拦截器是在过滤器之间运行的。

执行顺序举例

拦截器,spring-mvc.xml 中:

按 Ctrl+C
<mvc:interceptors>
        <!--  使用bean定义一个Interceptor,直接定义在mvc:interceptors根下面的Interceptor将拦截所有的请求  -->
        <!-- <bean/> -->

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/893166aeea1e25d7761addd2482f5202.html