快捷搜索: 王者荣耀 脱发

过滤器和拦截器的区别

一、过滤器(filter)

过滤器(filter),客服端与web资源之间的请求和响应都通过过滤器进行过滤。比如web前端和服务端进行交互,但端口号又不一样,这样就存在了跨域问题,可以通过配置过滤器解决。

1、SpringBoot中前后端跨域问题解决方式:过滤器

import org.springframework.stereotype.Component;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Component
@WebFilter(urlPatterns = "/*", filterName = "authFilter")  //这里的“/*” 表示的是需要拦截的请求路径
public class PassHttpFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletResponse httpResponse = (HttpServletResponse)servletResponse;
        httpResponse.setHeader("Access-Control-Allow-Headers","Origin, X-Requested-With, Content-Type, Accept");
        httpResponse.setHeader("Access-Control-Allow-Credentials", "true");
        httpResponse.addHeader("Access-Control-Allow-Origin", "http://127.0.0.1:8020");
        filterChain.doFilter(servletRequest, httpResponse);
    }

    @Override
    public void destroy() {
    }
}

2、禁止访问某IP地址

客户端发出访问某IP地址时,经过过滤器后,客户端得到的响应是出现该IP地址禁止被访问的提示。在Javaweb中,传入的request、response提前过滤一些信息,或者提前设置一些参数,然后再传入servlet或者struts的action进行业务逻辑,比如过滤掉非法url,或者传入servlet或者struts的action前统一设置字符集,或者去掉一些非法字符。

二、拦截器(interceptor)

拦截器是面向切面编程的,面向切面就是将多个模块的通用服务进行分离,如权限管理、日志服务,它们在多个模块中都会用到,就可以将其各自封装为一个可用模块。而这些通用服务的具体实现是通过拦截器来完成。比如用户客户端访问一些保密模块都先通过权限审查的拦截器进行权限审查,确定用户是否具有该项操作的权限后才能向下执行。

面向界面编程就是在你的service或者一个方法前,调用一个方法,或者在方法后调用一个方法,比如动态代理就是拦截器的简单实现,在你调用方法前打印出字符串,也可以在调用方法后打印出字符串,甚至在抛出异常的时候做业务逻辑的操作。

三、过滤器和拦截器的区别

  1. 过滤器依赖于servlet,拦截器不依赖servlet;
  2. 过滤器基于函数回调,拦截器基于Java的反射机制;
  3. 过滤器可对所有请求起作用,拦截器只对action请求起作用;
  4. 在action的声明周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次;

这两个之间最大的区别就是,过滤器可以包装Request和Response,而拦截器并不能。

往期精彩内容:

经验分享 程序员 微信小程序 职场和发展