Filter过滤器的使用【支持Spring MVC和Spring Boot】

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类结构图
    img
  • 过滤器的生命周期

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类型

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值