首页 > 应用开发 > Java > java中的filter
Filter简介
从功能角度来说,Filter能做什么?
从API角度来说,如何实现Filter?
从原理角度来说,Filter是如何实现拦截的?
Filter生命周期和Filter链
Filter生命周期的三个方法:init、doFilter和destory
Filter链及其调用顺序
Filter高级开发
HttpServletRequestWrapper
HttpServletResponseWrapper
动态代理
Filter映射
Filter案例
|
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
|
package com.rk.filter;
import java.io.IOException;
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 HelloFilter implements Filter
{
public HelloFilter()
{
System.out.println("HelloFilter构造函数!");
}
@Override
public void init(FilterConfig filterConfig) throws ServletException
{
System.out.println("HelloFilter.init()方法");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
ServletException
{
System.out.println("HelloFilter.doFilter()前");
chain.doFilter(request, response);
System.out.println("HelloFilter.doFilter()后");
}
@Override
public void destroy()
{
System.out.println("HelloFilter.destroy()");
}
}
|
|
1
2
3
4
5
6
7
8
9
10
|
<!-- Filter配置 -->
<filter>
<filter-name>HelloFilter</filter-name>
<filter-class>com.rk.filter.HelloFilter</filter-class>
</filter>
<!-- Filter映射配置 -->
<filter-mapping>
<filter-name>HelloFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
|
|
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
package javax.servlet;
import java.io.IOException;
/**
* A filter is an object that performs filtering tasks on either the request to a resource (a servlet or static content), or on the response from a resource, or both.
* <br><br>
* Filters perform filtering in the <code>doFilter method. Every Filter has access to
** a FilterConfig object from which it can obtain its initialization parameters, a
** reference to the ServletContext which it can use, for example, to load resources
** needed for filtering tasks.
** <p>
** Filters are configured in the deployment descriptor of a web application
** <p>
** Examples that have been identified for this design are<br>
** 1) Authentication Filters <br>
** 2) Logging and Auditing Filters <br>
** 3) Image conversion Filters <br>
** 4) Data compression Filters <br>
** 5) Encryption Filters <br>
** 6) Tokenizing Filters <br>
** 7) Filters that trigger resource access events <br>
** 8) XSL/T filters <br>
** 9) Mime-type chain Filter <br>
* @since Servlet 2.3
*/
public interface Filter {
/**
* Called by the web container to indicate to a filter that it is being placed into
* service. The servlet container calls the init method exactly once after instantiating the
* filter. The init method must complete successfully before the filter is asked to do any
* filtering work. <br><br>
* The web container cannot place the filter into service if the init method either<br>
* 1.Throws a ServletException <br>
* 2.Does not return within a time period defined by the web container
*/
public void init(FilterConfig filterConfig) throws ServletException;
/**
* The <code>doFilter method of the Filter is called by the container
* each time a request/response pair is passed through the chain due
* to a client request for a resource at the end of the chain. The FilterChain passed in to this
* method allows the Filter to pass on the request and response to the next entity in the
* chain.<p>
* A typical implementation of this method would follow the following pattern:- <br>
* 1. Examine the request<br>
* 2. Optionally wrap the request object with a custom implementation to
* filter content or headers for input filtering <br>
* 3. Optionally wrap the response object with a custom implementation to
* filter content or headers for output filtering <br>
* 4. a) <strong>Either invoke the next entity in the chain using the FilterChain object (<code>chain.doFilter()), <br>
** 4. b) <strong>or not pass on the request/response pair to the next entity in the filter chain to block the request processing<br>
** 5. Directly set headers on the response after invocation of the next entity in the filter chain.
**/
public void doFilter ( ServletRequest request, ServletResponse response, FilterChain chain ) throws IOException, ServletException;
/**
* Called by the web container to indicate to a filter that it is being taken out of service. This
* method is only called once all threads within the filter's doFilter method have exited or after
* a timeout period has passed. After the web container calls this method, it will not call the
* doFilter method again on this instance of the filter. <br><br>
*
* This method gives the filter an opportunity to clean up any resources that are being held (for
* example, memory, file handles, threads) and make sure that any persistent state is synchronized
* with the filter's current state in memory.
*/
public void destroy();
}
|
|
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 javax.servlet;
import java.util.Enumeration;
/**
*
* A filter configuration object used by a servlet container
* to pass information to a filter during initialization.
*
*/
public interface FilterConfig {
/**
* Returns the filter-name of this filter as defined in the deployment descriptor.
*/
public String getFilterName();
/**
* Returns a reference to the {@link ServletContext} in which the caller
* is executing.
*/
public ServletContext getServletContext();
/**
* Returns a <code>String containing the value of the
* named initialization parameter, or <code>null if
* the parameter does not exist.
*/
public String getInitParameter(String name);
/**
* Returns the names of the filter's initialization parameters
* as an <code>Enumeration of <code>String objects,
* or an empty <code>Enumeration if the filter has
* no initialization parameters.
*/
public Enumeration getInitParameterNames();
}
|
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
package javax.servlet;
import java.io.IOException;
/**
* A FilterChain is an object provided by the servlet container to the developer
* giving a view into the invocation chain of a filtered request for a resource. Filters
* use the FilterChain to invoke the next filter in the chain, or if the calling filter
* is the last filter in the chain, to invoke the resource at the end of the chain.
*
**/
public interface FilterChain {
/**
* Causes the next filter in the chain to be invoked, or if the calling filter is the last filter
* in the chain, causes the resource at the end of the chain to be invoked.
*
*/
public void doFilter ( ServletRequest request, ServletResponse response ) throws IOException, ServletException;
}
|
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29917475/viewspace-2119359/ ,如需转载,请注明出处,否则将追究法律责任。