文章

Servlet过滤器

首先,创建三个过滤器: 第一个:package com.xust.jia.filter;import java.io.IOException;import java.text.SimpleDateFormat;import java.util.Date;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;im_servlet的过滤器 csdn博客

Servlet过滤器

文章信息

  • 原文链接:https://jiayq.blog.csdn.net/article/details/76464659
  • 发布时间:2017-07-31 19:30:19
  • 阅读量:480
  • 分类:java专栏收录该内容, 订阅专栏
  • 标签:#servlet, #im

摘要

文章浏览阅读480次。首先,创建三个过滤器: 第一个:package com.xust.jia.filter;import java.io.IOException;import java.text.SimpleDateFormat;import java.util.Date;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;im_servlet的过滤器 csdn博客


首先,什么是过滤器?
这里写图片描述
过滤器有什么功能?
这里写图片描述
过滤器的执行流程:
这里写图片描述
方法说明:
这里写图片描述
首先,创建三个过滤器:
第一个:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package com.xust.jia.filter;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;


/**
 * 
 * @author jia
 *
 *创建一个过滤器,用于记录访问的地址
 *
 */

public class Filter implements javax.servlet.Filter{

    @Override
    public void destroy() {
        // TODO Auto-generated method stub
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println();
        System.out.println();
        System.out.println(sdf.format(new Date())+"过滤器0将被销毁");
        System.out.println();
        System.out.println();
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        // TODO Auto-generated method stub
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println();
        System.out.println();
        System.out.println(sdf.format(new Date())+"filter0访问的地址:"+((HttpServletRequest)request).getServletPath());
        System.out.println();
        System.out.println();
        chain.doFilter(request, response);
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // TODO Auto-generated method stub
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println();
        System.out.println();
        System.out.println(sdf.format(new Date())+"过滤器0将被创建");
        System.out.println();
        System.out.println();
    }

}

第二个:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package com.xust.jia.filter;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;


public class Filter1 implements Filter{

    @Override
    public void destroy() {
        // TODO Auto-generated method stub
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println();
        System.out.println();
        System.out.println(sdf.format(new Date())+"过滤器1将被销毁");
        System.out.println();
        System.out.println();
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        // TODO Auto-generated method stub
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        if(request.getParameter("user") != null){
            System.out.println();
            System.out.println();
            System.out.println(sdf.format(new Date())+"filter1参数:"+request.getParameter("user"));
        }
        if(request.getParameter("user") != null){
            System.out.println(sdf.format(new Date())+"filter1参数:"+request.getParameter("password"));
            System.out.println();
            System.out.println();
        }
        chain.doFilter(request, response);
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // TODO Auto-generated method stub
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println();
        System.out.println();
        System.out.println(sdf.format(new Date())+"过滤器1将被创建");
        System.out.println();
        System.out.println();
    }

}

第三个:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package com.xust.jia.filter;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class Filter2 implements Filter{

    @Override
    public void destroy() {
        // TODO Auto-generated method stub
        System.out.println();
        System.out.println();
        System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "Filter2被销毁");
        System.out.println();
        System.out.println();
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        // TODO Auto-generated method stub
        System.out.println();
        System.out.println();
        System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "Filter2被使用");
        System.out.println();
        System.out.println();
        chain.doFilter(request, response);
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // TODO Auto-generated method stub
        System.out.println();
        System.out.println();
        System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "Filter2被创建");
        System.out.println();
        System.out.println();
    }

}

然后在Web.xml中进行配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<filter>
    <filter-name>filter</filter-name>
    <filter-class>com.xust.jia.filter.Filter</filter-class>
  </filter>
   <filter>
    <filter-name>filter1</filter-name>
    <filter-class>com.xust.jia.filter.Filter1</filter-class>
  </filter>
  <filter>
    <filter-name>filter2</filter-name>
    <filter-class>com.xust.jia.filter.Filter2</filter-class>
  </filter>

 <filter-mapping>
    <filter-name>filter2</filter-name>
    <url-pattern>/*</url-pattern>
 </filter-mapping>
  <filter-mapping>
    <filter-name>filter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <filter-mapping>
    <filter-name>filter1</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

注意:
mapping的顺序就是过滤器链的顺序:
比如:filter1在mapping的第一个,那么,当过滤器开始工作的时候,最先进入的就是filter1的doFilter函数。所以需要注意。
然后,启动服务器,开始运行项目:
这里写图片描述
这就是服务器创建过滤器的顺序,这个顺序是不确定的,但是这一次是这个顺序,那么以后只要数量不发生变化,那么顺序就是一样的。
具体原因是因为服务器里的HashMap,但具体在那里,请各位百度。
这里写图片描述
这里的过滤链的先后顺序就是mapping的顺序了。
这里写图片描述

所以,总结如下:
过滤器在Web.xml中配置,mapping的顺序就是链的顺序。
如果需要拒绝这个请求,在最里层不加chain.doFilter().
最后一层如果添加了chain.doFilter()函数,那么服务器会在Web.xml中进行搜索,如果是最后一层的过滤器,那么就通过这个请求,否则就拒绝。
通过请求是通过默认调用servlet的doGet方法,将request,respones参数传入来进行实现。

本文由作者按照 CC BY 4.0 进行授权