精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● Java>>JAVA编程>>JSP/Servlet>>[原创]简单 Servlet2.3 filter 开发

主题:[原创]简单 Servlet2.3 filter 开发
发信人: huaronghu(润名)
整理人: zjxyz(2002-09-10 10:11:31), 站内信件
简单 Servlet2.3 filter 开发 

作者:润名 

一:简介 

 新的 Java Servlet 2.3 规范有不少最激动人心的功能,其中之一便是 filter (过滤器)。filter可以改变一个请求(request)或者是修改响应(response)。filter不是一个servlet,它只是一个servlet接受到请求前的预处理器。就是说,用户发送一个请求给servlet时,在servlet处理之前,这个filter首先执行,然后才是servlet的执行。 

二:作用 

filter可以用在下面几个方面 

1:访问特定资源(Web 页、JSP 页、servlet)时的身份 

2:访问资源的记录 

3:访问资源的转换 

三:编写filter 

一个filter 必须实现javax.servlet.Filter 接口,即实现下面的三个方法: 


1: doFilter(ServletRequest, ServletResponse, FilterChain):这是一个完成过滤行为的方法。这同样是上游过滤器调用的方法。引入的 FilterChain 对象提供了后续过滤器所要调用的信息。 


2: init(FilterConfig):这是一个容器所调用的初始化方法。它保证了在第一次 doFilter() 调用前由容器调用。您能获取在 web.xml 文件中指定的初始化参数。 


3: destroy():容器在破坏过滤器实例前,doFilter()中的所有活动都被该实例终止后,调用该方法。  

四:示例 

功能:限制客户端 IP 的访问 

代码如下: 

package com.Servlet.filter;  
import java.io.*; 
import javax.servlet.*; 
import javax.servlet.http.*; 
import javax.servlet.Filter; 

public class myfilter implements Filter 

private FilterConfig filterConfig = null; 

public void init(FilterConfig filterConfig) 

this.filterConfig = filterConfig; 


public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException 

try 

res.setContentType("text/html;charset=GBK"); 
PrintWriter out = res.getWriter(); 
String remoteAddr = ((HttpServletRequest) req).getRemoteAddr(); 

if ((remoteAddr.indexOf("127.0.0.1") != -1) || (remoteAddr.indexOf("localhost") != -1)) { //这里做判断 

out.println("<html><head></head><body>"); 
out.println("<h1>哈哈,IP 127.0.0.1 和 IP localhost 不能访问本网站~~</h1>"); 
out.println("</body></html>"); 
out.close(); 
return; 

else 

out.println("<html><head></head><body>"); 
out.println("<h1>恭喜,你已经成功访问本网站了~~</h1>"); 
out.println("</body></html>"); 
out.close(); 



catch (Exception e) 

e.printStackTrace(); 



public void destroy() 



  

实现思路:通过ServletRequest类的getRemoteAddr()方法得到访问这个应用的客户端ip,然后对这个ip作一些处理,如果不符合条件,可以限制访问。这样可以很好的保护应用。 

五:配置 

以 Weblogic 为例:每个使用filter的应用的web.xml类似下面 


<?xml version="1.0" ?> 
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> 
<web-app> 
<welcome-file-list> 
<welcome-file>index.html</welcome-file> 
<welcome-file>index.jsp</welcome-file> 
</welcome-file-list>  

// 下面是过滤器的配置 

<filter> 
<filter-name>MyFilter</filter-name> //这里是Filter的名字,随便你怎么起 
<filter-class>com.Servlet.filter.myfilter</filter-class> //Filter的类名,注意包含package 
</filter> 

<filter-mapping> 
<filter-name>MyFilter</filter-name>//与上面的保持一致 
<url-pattern>/*</url-pattern> //对所有资源应用此filter 
</filter-mapping> 
</web-app> 

  
  

如果一个应用有多个Filter,则在web.xml文件中,<filter-mapping>靠前的filter先执行。 

六:测试 

在 IE 浏览器中用 URL http://localhost:7001/ 访问看看发生什么情况。 

七:附加 

要想真正理解filter,建议读下面这篇文章。 

Tomcat 的过滤诀窍 

作者:润名  [email protected] 



----

[关闭][返回]