6.5 在Eclipse中开发Filter
Filter(过滤器)是Servlet 2.3规范中引入的新组件类型,可以截取发送至Servlet、JSP页面或静态页面的请求,也可以在响应发送至客户之前先行截获。这样就可以很容易地将应用于所有请求的任务或应用所提供的服务集中起来。过滤器可以全权访问请求及响应的体和首部,因此可以完成各种不同的转换。本节假定要限制网络地址处于“10.105.20”段的用户访问上一节实现的ScoreFindServlet,就可以为该应用添加一个Filter。
运行效果
在浏览器的地址栏中输入“http://10.105.20.117:8080/ScoreWeb/ScoreFind?SNO=1”,因为该URL处于“10.105.20”网段上,所以出现如图6-23所示的信息。
跟我做
(1)右击“ScoreWeb”工程的“src”源文件夹,在快捷菜单中选择【新建】|【其他】命令,打开【新建】对话框。
(2)在【向导】树形结构中选择【JBoss-IDE】|【Web Components】|【Filter】命令。
(3)单击【下一步】按钮,进入【New Web Filter】对话框。
(4)在【名称】文本框中输入“ScoreFilter”,其他保持默认状态,如图6-24所示。

图6-23 过滤器显示的信息 图6-24 新建过滤器
(5)单击【完成】按钮,生成ScoreFilter类,该类实现了Filter接口。
(6)在生成的doFilter函数中完成如下代码:
//取得客户端的IP地址
String remoteIP=request.getRemoteAddr();
int index=remoteIP.lastIndexOf(".");
//取得客户端所处的网段
String subIP=remoteIP.substring(0,index);
//判断是否在10.105.20网段上
if(subIP.equals("10.105.20")){
PrintWriter out=response.getWriter();
out.println("<html><head></head><body>");
out.println("<h1>Sorry,you can not access our application!</h1>");
out.println("</body></html>");
out.flush();
return;
}
//将控制权交给下一个Filter
chain.doFilter(request,response);
%注意:每一个Filter从doFilter()方法中得到当前的request及response。在这个方法中,可以进行任何的针对request及response的操作(包括收集数据,包装数据等)。Filter调用chain.doFilter()方法把控制权交给下一个Filter。一个Filter在doFilter()方法中结束。如果一个Filter想停止request处理而获得对response的完全控制,则它可以不调用下一个Filter。
ScoreFilter根据取得的客户端IP地址,判断客户端所处的网段,如果其在“10.105.20”网段上就会向客户端发送提示信息。







