2.过滤器

Posted eaglesour

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2.过滤器相关的知识,希望对你有一定的参考价值。

1. 什么是过滤器

过滤器是一个运行在服务器端的程序,先于与之相关的servlet或JSP页面之前运行实现对请求资源的过滤的功能;

过滤器可附加到一个或多个servlet或jsp页面上,可以检查请求信息也可以处理相应信息;

filter的基本功能是对Servlet容器调用Servlet的过程进行拦截,从而在Servlet执行前后实现一些特殊的功能。

技术分享图片

如图,浏览器发出的请求先递交给第一个filter进行过滤,符合规则则放行,递交给filter链中的下一个过滤器进行过滤。过滤器在链中的顺序与它在web.xml中配置的顺序有关,配置在前的则位于链的前端。当请求通过了链中所有过滤器后就可以访问资源文件了,如果不能通过,则可能在中间某个过滤器中被处理掉。

在doFilter()方法中,chain.doFilter()前的一般是对request执行的过滤操作,chain.doFilter后面的代码一般是对response执行的操作。过滤链代码的执行顺序如下:

技术分享图片

 过滤器一般用于登录权限验证、资源访问权限控制、敏感词汇过滤、字符编码转换等等操作,便于代码重用,不必每个servlet中还要进行相应的操作。

 

2. 过滤器的编写流程

  • 实现类,需要实现接口javax.servlet.Filter;
技术分享图片
 1 package com.eagle.web;
 2 
 3 import java.io.IOException;
 4 import javax.servlet.ServletException;
 5 import javax.servlet.http.HttpServlet;
 6 import javax.servlet.http.HttpServletRequest;
 7 import javax.servlet.http.HttpServletResponse;
 8 
 9 public class ServletFilter extends HttpServlet {
10 
11     private static final long serialVersionUID = 1L;
12 
13     public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
14         String name = (String) request.getAttribute("name");
15         System.out.println("servlet获取request域中的name属性="+name);
16         response.getWriter().write("hello haohao...name="+name);
17     }
18 
19     public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
20         doGet(request, response);
21     }
22 }
ServletFilter
技术分享图片
 1 package com.eagle.filter;
 2 
 3 import java.io.IOException;
 4 import javax.servlet.Filter;
 5 import javax.servlet.FilterChain;
 6 import javax.servlet.FilterConfig;
 7 import javax.servlet.ServletException;
 8 import javax.servlet.ServletRequest;
 9 import javax.servlet.ServletResponse;
10 
11 public class Demo1Filter implements Filter {
12 
13     public Demo1Filter() {
14 
15     }
16 
17     public void init(FilterConfig fConfig) throws ServletException {
18 
19     }
20 
21     public void destroy() {
22 
23     }
24 
25     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
26             throws IOException, ServletException {
27         request.setAttribute("name", "filter");
28         System.out.println("servlet之前进行调用,设置request域的name属性为filter");
29         chain.doFilter(request, response);
30     }
31 }
Demo1Filter
  • 配置,在web.xml使用<filter>和<filter-mapping>进行配置。
技术分享图片
1 <filter>
2     <display-name>Demo1Filter</display-name>
3     <filter-name>Demo1Filter</filter-name>
4     <filter-class>com.eagle.filter.Demo1Filter</filter-class>
5   </filter>
6   <filter-mapping>
7     <filter-name>Demo1Filter</filter-name>
8     <url-pattern>/*</url-pattern>
9   </filter-mapping>
web.xml

技术分享图片

技术分享图片

3. 配置web.xml详解

<filter>
  <filter-name>loginFilter</filter-name>          //过滤器名称
  <filter-class>com.x.control.loginFilter</filter-class>       //过滤器类的包路径
  <init—param>                        //可选
    <param—name>参数名</param-name>          //过滤器初始化参数
    <param-value>参数值</param-value>
  </init—pamm>
</filter>

<filter-mapping>                     //过滤器映射
  <filter-name>loginFilter</filter-name>
  <url-pattern>指定过滤器作用的对象</url-pattern>

</filter-mapping>

在配置中需要注意的有两处:

  • 一是<filter-class>指明过滤器类所在的包路径。
  • 二是<url-pattren>处定义过滤器作用的对象。一般有以下规则:

    1:作用于所有web资源:<url—pattern>/*</url-pattern>。则客户端请求访问任意资源文件时都要经过过滤器过滤,通过则访问文件,否则拦截。

    2:作用于某一文件夹下所有文件:<url—pattern>/dir/*</url-pattern>

    3:作用于某一种类型的文件:<url—pattern>*.扩展名</url-pattern>。比如<url—pattern>*.jsp</url-pattern>过滤所有对jsp文件的访问请求。

    4:作用于某一文件夹下某一类型文件:<url—pattern>/dir/*.扩展名</url-pattern>

    如果一个过滤器需要过滤多种文件,则可以配置多个<filter-mapping>,一个mapping定义一个url-pattern来定义过滤规则。












以上是关于2.过滤器的主要内容,如果未能解决你的问题,请参考以下文章

CPNtools协议建模安全分析---实例变迁标记

Huawei_Netconf_Ncclient

基于内部片段的graphql过滤器(gatsbyJS)

在底部导航栏中保存片段状态

在Pandoc lua过滤器中连接字符串片段

过滤作为 ViewPager 片段一部分的 ListView