一:简介
filter(过滤器)是servlet2.3中增加的一个新功能,filter可以改变一个请求(request)或者是修改响应(response)。filter不是一个servlet,它只是一个servlet接受到请求前的预处理器。就是说,用户发送一个请求给servlet时,在servlet处理之前,这个filter首先执行,然后才是servlet的执行。
二:作用
filter可以用在下面几个方面
1:访问特定资源(Web 页、JSP 页、servlet)时的身份认证
2:访问资源的记录
3:访问资源的转换
三:编写filter
一个filter 必须实现javax.servlet.Filter 接口,即实现下面的三个方法:
1:void init(FilterConfig config) throws ServletException: 初始化方法
2:void destroy():
3:void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException: 完成具体的过滤工作。
四:示例
示例一:限制访问资源
我们以参考文献1中的第一个例子介绍怎样限制用户访问特定的资源
在那个例子中,对浏览器为IE的用户做了限制,原文讲的很清楚,关键代码如下:
看看doFilter的参数可知,利用request和response我们可以对做各种处理。例如可以通过ServletRequest类的getRemoteAddr()方法得到访问这个应用的客户端ip,然后对这个ip作一些处理,如果不符合条件,可以限制访问。这样可以很好的保护应用。
示例二:资源转换
参考文献一中的第二个例子演示了怎样将用户要访问的资源进行转换。
示例三:访问记录
类似于一个跟踪程序,参考文献二中的第二个例子演示了怎样记录用户访问的所有属于同一个应用的资源。
五:配置
以tomcat为例:每个使用filter的应用的web.xml类似下面
如果一个应用有多个Filter,则在web.xml文件中,<filter-mapping>靠前的filter先执行。
六:测试
可以把参考文献一和二中的代码中的war文件放到tomcat/webapp目录下,启动tomcat,用类似http://localhost:8080/clickstream(此乃文献二中第二个例子的访问方法)访问。
filter(过滤器)是servlet2.3中增加的一个新功能,filter可以改变一个请求(request)或者是修改响应(response)。filter不是一个servlet,它只是一个servlet接受到请求前的预处理器。就是说,用户发送一个请求给servlet时,在servlet处理之前,这个filter首先执行,然后才是servlet的执行。
二:作用
filter可以用在下面几个方面
1:访问特定资源(Web 页、JSP 页、servlet)时的身份认证
2:访问资源的记录
3:访问资源的转换
三:编写filter
一个filter 必须实现javax.servlet.Filter 接口,即实现下面的三个方法:
1:void init(FilterConfig config) throws ServletException: 初始化方法
2:void destroy():
3:void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException: 完成具体的过滤工作。
四:示例
示例一:限制访问资源
我们以参考文献1中的第一个例子介绍怎样限制用户访问特定的资源
在那个例子中,对浏览器为IE的用户做了限制,原文讲的很清楚,关键代码如下:
CODE
1
import
java.io.
*
;
2 import javax.servlet. * ;
3 import javax.servlet.http. * ;
4
5 public final class IEFilter implements Filter {
6
7 private FilterConfig filterConfig = null;
8
9 public void doFilter(ServletRequest request, ServletResponse response,
10 FilterChain chain)
11 throws IOException, ServletException {
12 String browserDet = ((HttpServletRequest) request).getHeader("User-Agent").toLowerCase();
13
14 if ( browserDet.indexOf("msie") != -1) {
15 PrintWriter out = response.getWriter();
16 out.println("<html><head></head><body>");
17 out.println("<h1>Sorry, page cannot be displayed!</h1>");
18 out.println("</body></html>");
19 out.flush();
20 return;
21 }
22
23 chain.doFilter(request, response);
24
25 }
26
27 public void destroy() {
28 }
29
30 public void init(FilterConfig filterConfig) {
31 this.filterConfig = filterConfig;
32 }
2 import javax.servlet. * ;
3 import javax.servlet.http. * ;
4
5 public final class IEFilter implements Filter {
6
7 private FilterConfig filterConfig = null;
8
9 public void doFilter(ServletRequest request, ServletResponse response,
10 FilterChain chain)
11 throws IOException, ServletException {
12 String browserDet = ((HttpServletRequest) request).getHeader("User-Agent").toLowerCase();
13
14 if ( browserDet.indexOf("msie") != -1) {
15 PrintWriter out = response.getWriter();
16 out.println("<html><head></head><body>");
17 out.println("<h1>Sorry, page cannot be displayed!</h1>");
18 out.println("</body></html>");
19 out.flush();
20 return;
21 }
22
23 chain.doFilter(request, response);
24
25 }
26
27 public void destroy() {
28 }
29
30 public void init(FilterConfig filterConfig) {
31 this.filterConfig = filterConfig;
32 }
看看doFilter的参数可知,利用request和response我们可以对做各种处理。例如可以通过ServletRequest类的getRemoteAddr()方法得到访问这个应用的客户端ip,然后对这个ip作一些处理,如果不符合条件,可以限制访问。这样可以很好的保护应用。
示例二:资源转换
参考文献一中的第二个例子演示了怎样将用户要访问的资源进行转换。
示例三:访问记录
类似于一个跟踪程序,参考文献二中的第二个例子演示了怎样记录用户访问的所有属于同一个应用的资源。
五:配置
以tomcat为例:每个使用filter的应用的web.xml类似下面
CODE
1
<
web-app
>
2 < filter >
3 < filter-name > Filter </ filter-name > //这里是Filter的名字,随便你怎么起
4 < filter-class > FilterClass </ filter-class > //Filter的类名,注意包含package
5 </ filter >
6
7 < filter-mapping >
8 < filter-name > Filter </ filter-name > //与上面的保持一致
9 < url-pattern > /* </ url-pattern > //对所有资源应用此filter
10 </ filter-mapping >
11 </ web-app >
2 < filter >
3 < filter-name > Filter </ filter-name > //这里是Filter的名字,随便你怎么起
4 < filter-class > FilterClass </ filter-class > //Filter的类名,注意包含package
5 </ filter >
6
7 < filter-mapping >
8 < filter-name > Filter </ filter-name > //与上面的保持一致
9 < url-pattern > /* </ url-pattern > //对所有资源应用此filter
10 </ filter-mapping >
11 </ web-app >
如果一个应用有多个Filter,则在web.xml文件中,<filter-mapping>靠前的filter先执行。
六:测试
可以把参考文献一和二中的代码中的war文件放到tomcat/webapp目录下,启动tomcat,用类似http://localhost:8080/clickstream(此乃文献二中第二个例子的访问方法)访问。