Servlet的Filter的使用

Stella981
• 阅读 864

    Filter可认为是Servlet的“加强版”,主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理,是个典型的处理链。Filter也可以对用户请求生成相应,这一点与Servlet相同,但实际上很少会这样使用。使用Filter的完整流程是:Filter对用户的请求进行预处理,接着将请求交给Servlet进行处理并响应生成,最后Filter在对服务器响应进行后处理。

1. Filter有如下几个用处:

  • 在HttpServletRequest到达Servlet之前,拦截客户的HttpServletRequest

  • 根据需要,检查HttpServletRequest,也可以修改HttpServletRequest的头和数据

  • 在HttpServletResponse到达客户端之前,拦截HttpServletResponse

  • 根据需要,检查HttpServletResponse,也可以修改HttpServletResponse的头和数据

2. Filter有如下几个种类:

  • 用户授权的Filter:Filter负责检查用户请求,根据请求过滤用户的非法请求,通常用于权限管理。

  • 日志Filter:详细记录某些特殊的用户请求

  • 负责解码的Filter:包括对非标准编码的请求解码

  • 能改变XML内容的XSLT Filter等

3. 创建一个Filter只需两个步骤:

  1). 创建Filter处理类 2). 在web.xml文件中配置Filter

3.1 创建Filter处理类

  创建Filter必须实现javax.servlet.Filter接口,在该接口中定义了如下三个方法:

  • void init(FilterConfig config):用于完成Filter的初始化

  • void destroy():用于Filter销毁钱,完成某些资源的回收

  • void doFilter(ServletRequest request, ServletResponse response, FilterChain chain):实现过滤功能,该方法就是对每个请求及响应增加的额外处理

  下面是一个日志Filter,它负责拦截所有的用户请求,并将请求的信息记录在日志中。

@WebFilter(filterName="log", urlPatterns={"/*"}, initParams={ //这里使用注解的方式配置Filter
  @WebInitParam(name="encoding" value="UTF-8"),
  @WebInitParam(name="loginPage" value="/login.jsp")
}) 
public class LogFilter implements Filter {
  private FilterConfig config;//FilterConfig可用于访问Filter的配置信息
  public void init(FilterConfig config) { this.config = config; }
  public void destroy(){this.config = null;}
  public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException{
    //下面的代码用于对用户请求执行预处理
    ServletContext context = this.config.getServletContext();//获取ServletContext对象,用于记录日志
    long before = System.currentTimeMillis();
    System.out.println("开始过滤...");
    HttpServletRequest request = (HttpServletRequest)req;
    System.out.println("已经拦截到用户的请求地址:" + request.getServletPath());
    chain.doFilter(req, resp);//Filter只是链式处理,请求依然放行到目的地址
 
    //下面的代码用于对服务器响应执行后处理
    long after = System.currentTimeMillis();
    System.out.println("过滤结束");
    System.out.println("请求被定位到:" + request.getRequestURI() + " 耗时:" + (after - before));//这里只是输出提示信息
  }
}

  上面的代码实现了doFilter()方法,实现该方法可以实现对用户请求的预处理,也可实现对服务器响应的后处理,它们的分界线为是否调用了chain.doFilter()方法,在这之前的是对用户请求的预处理,在这之后的,是对服务器响应的后处理。当Filter对请求过滤后,依然将请求发送到目的地址。如果需要检查权限,可以在Filter中根据用户请求的HttpSession,判断用户权限是否足够。如果权限不足,直接调用重定向即可,无需调用chain.doFilter()方法。

3.2 配置Filter

  Filter在web.xml中的配置和Servlet在web.xml中的配置很相似,区别在于:一个Servlet通常只配置一个URL,而Filter可以同时拦截多个请求的URL,因此在配置Filter的urlPatterns时,通常会使用模式字符串,使得Filter可以拦截多个请求。和Servlet相似的是,配置Filter同样有两种方式:1). 在Filter类中通过注解进行配置  2). 在web.xml文件中进行配置

  @WebFilter支持的常用属性介绍:

  • asyncSupported:指定该Filter是否支持异步操作模式

  • dispatcherTypes:指定该Filter仅对那种dispatcher模式的请求进行过滤。该属性支持ASYNC, ERROR, FORWARD, INCLUDE, REQUEST这5个值的任意组合,默认值为同时过滤这5中模式的请求

  • displayName:指定该Filter的显示名

  • filterName:指定该Filter的名称

  • initParams:用于为该Filter配置参数

  • servletNames:该属性可以指定多个Servlet名称,用于指定该Filter仅对这些Servlet进行过滤

  • urlPatterns/value:这两个属性的作用完全相同,用于指定该Filter所拦截的URL

  下面是一个在web.xml中配置Filter的例子:

<filter>
  <filter-name>log</filter-name> <!-- 此属性相当于@WebFilter中的filterName属性 -->
  <filter-class>com.abc.LogFilter</filter-class>  <!-- Filter的实现类 -->
  <init-param>
    <param-name>encoding</param-name>
    <param-value>UTF-8</param-value>
  </init-param>
  <init-param>
    <param-name>loginPage</param-name>
    <param-value>/login.jsp</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>log</filter-name>
  <url-pattern>/*</url-pattern> <!-- 负责拦截所有的URL,相当于@WebFilter中的urlPatterns属性 -->
</filter-mapping>
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
SSH基础的面试题1
1.简述struts2的执行流程!(http://static.oschina.net/uploads/space/2016/0311/155522_1MzX_2646795.jpg)1)客户端初始化一个指向Servlet容器请求;2)这个请求经过一系列的过滤器(Filter)3)接着Filter
Stella981 Stella981
3年前
Spring MVC 和 Struts2 的比较
SpringMVC与Struts2的比较1:框架核心机制:SpringMVC(DispatcherServlet)采用Servlet实现,Struts2采用Filter(StrutsPrepareAndExecuteFilter)实现。Filter在容器启动之后即初始化;服务停止以后坠毁,晚于Servlet。Servlet在是在调用时初始化,先于F
Stella981 Stella981
3年前
Spring Boot使用笔记
1\. boot将自动把bean类型为Servlet,Filter,listener等servlet规范中的类型,向boot内嵌的web容器注册,需要控制filter、servlet的初始化和参数等,可以使用FilterRegistrationBean和ServletRegistrationBean,来自文档https://docs.spring.i
Easter79 Easter79
3年前
SpringMVC第一天HelloWorld
1,普通Servlet的流程是通过配置<servlet</servlet和<servletmapping</servletmapping来拦截请求交给对应的Servlet来处理使用SpringMVC需要配置一个SpringMVC自带的Servlet,DispatcherServlet,使用他来拦截请求交给SpringMVC处理 we
Stella981 Stella981
3年前
Eclipse搭建springboot项目(八)拦截器、过滤器、监听器
知识点:1、SpringBoot2.x过滤器Filter和使用Servlet3.0配置自定义Filter(核心知识)  filter简单理解:人检票员(filter)景点  1)SpringBoot启动默认加载的Filter    characterEncodingFilter    
Stella981 Stella981
3年前
Servlet容器,过滤器,拦截器,监听器整理
Servlet容器JavaServlet是与平台无关的服务器端组件,运行于Servlet容器中(如Tomcat),Servlet容器负责Servlet和客户端的通信以及调用Servlet的方法,Servlet和客户端的通信采用“请求/响应”的模式。Servlet可完成以下功能:1、创建并返回基于客户请求的动态HTML页面。2、创建可以嵌入到
Wesley13 Wesley13
3年前
Java Web 学习笔记
过滤器Filter功能:1、用来拦截传入的请求和传出的相应。2、修改或以某种方式处理正在客户端和服务端之间交换的数据流。如何使用?与使用Servlet类似,Filter是JavaWeb提供的一个借口,开发者只需要自定义一个类并且实现该接口即可packagecom.janeroad.filter;
Stella981 Stella981
3年前
Introduction of Servlet Filter(介绍javaweb组件之一过滤器filter)
javaweb的三大组件都需要交给web服务器运行,都需要在web.xml文件中配置。①Servlet:javax.servlet.Servlet通过http协议接受客户端的请求,并作出响应的Java应用程序②Filter过滤器:javax.servlet.Filter是一个接口,实现请求的拦截和放行,并可添加新功能,达到过滤请求的作用③list