Spring Boot是在Spring的基础上封装而成,所以Spring的过滤器和拦截器在Spring Boot中同样可以使用。本文重点讲解Spring 中的过滤器。

在 Spring的web包中中提供有很多过滤器,这些过滤器位于org.springframework.web.filter。

  • 过滤器的作用

过滤器可以再请求(dispacherServlet之前)和响应(响应给客户端)之前做一部分预处理,有效的过滤掉不需要的内容,而且过滤器可以被复用,节省了大量的复用代码,提高了java的代码执行效率。

  • 过滤器的实现方式

(1) 直接实现Filter,这一类过滤器只有CompositeFilter;
(2) 继承抽象类GenericFilterBean,该类实现了javax.servlet.Filter,这一类的过滤器只有一个,即DelegatingFilterProxy;
(3) 继承抽象类OncePerRequestFilter,该类为GenericFilterBean的直接子类,这一类过滤器包括CharacterEncodingFilter、HiddenHttpMethodFilter、HttpPutFormContentFilter、RequestContextFilter和ShallowEtagHeaderFilter;
(4) 继承抽象类AbstractRequestLoggingFilter,该类为OncePerRequestFilter的直接子类,这一类过滤器包括CommonsRequestLoggingFilter、Log4jNestedDiagnosticContextFilter和ServletContextRequestLoggingFilter

  • 过滤器在容器中的位置

过滤器在web资源之前,可以对所有请求进行拦截,并可以在服务器端返回给客户信息前进行截取。
Filter:用来拦截请求,处于客户端与被请求资源之间,目的是重用代码。Filter链,在web.xml中哪个先配置,哪个就先调用。在filter中也可以配置一些初始化参数。(Spring Boot中不需要通过代码配置)
Java中的Filter 并不是一个标准的Servlet ,它不能处理用户请求,也不能对客户端生成响应。 主要用于对HttpServletRequest 进行预处理,也可以对HttpServletResponse 进行后处理,是个典型的处理链。

  • Filter的应用场景
  1. 用户授权的Filter(安全登录)
  2. 日志Filter(用户日志记录)
  3. 负责解码的Filter(控制编码方式)
  4. 检查请求内容(敏感词过来)
  • Filter 有如下几个用处:
  1. 在HttpServletRequest 到达Servlet 之前,拦截客户的HttpServletRequest 。
  2. 根据需要检查HttpServletRequest ,也可以修改HttpServletRequest 头和数据。
  3. 在HttpServletResponse 到达客户端之前,拦截HttpServletResponse 。
  4. 根据需要检查HttpServletResponse ,可以修改HttpServletResponse 头和数据。
  • Filter类结构图
    Filter过滤器的使用【支持Spring MVC和Spring Boot】
  • 过滤器的生命周期

1.web.xml(实例化)
2.init(初始化)
3.doFilter(过滤)
4.destory(销毁)

  • 以安全登录为例讲解Filter的使用
  1. 用户登录filter:UserLoginFilter
public class UserLoginFilter implements Filter{
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filter)
            throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse rpon = (HttpServletResponse)response;
        if(req.getSession().getAttribute("status") == null) {
            request.setAttribute("error", "非法进入");
            request.getRequestDispatcher("/alogin.jsp").forward(request, response);;
        }else { 
            //放行
            //如果有下一个过滤器则跳到下一个过滤器
            //如果没有下一个过滤器则跳到目标页面
            filter.doFilter(request, response);
        }
    }
    public void init(FilterConfig arg0) throws ServletException {
    }
        public void destroy() {
    }
}
  1. 配置web.xml
  <!-- 后台登录过滤 -->
   <filter>
    <filter-name>UserLoginFilter</filter-name>
    <filter-class>cn.haoeasy.filter.AdminFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>UserLoginFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

filter-class 为过滤器Filter类(init-prama为注入的set参数)
Filter-mapping中的url-pattern为过滤的url类型

相关文章:

  • 2021-08-26
  • 2021-06-08
  • 2021-06-03
  • 2021-06-29
  • 2021-12-23
  • 2021-12-10
  • 2021-06-05
  • 2021-11-19
猜你喜欢
  • 2021-04-21
  • 2021-10-11
  • 2021-05-29
  • 2021-08-14
  • 2021-11-23
  • 2021-05-02
  • 2021-11-08
相关资源
相似解决方案