Java Servlet规范2.3中的过滤器访问

王朝java/jsp·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

假如你想安装一个带有访问限制的servlet,但同时为了保证其安全又不想改变其源代码,那么你应该使用一个servlet过滤器。

Servlet过滤器包含在Java Servlet规范2.3版本中。它能够让你在servlet运作前截取请求,也能让你在servlet运作后修改请求。例如,假如用户已经登陆进入系统,那么MenuLabelFilter使用用户的配置取代了i18n的系统标签,书写格式为${propertyfile.menu.label},假如用户是guest,则使用浏览器缺省配置。

一个servlet过滤器可以分为两个部分:Java类自身以及在web.XML文件中的XML。要作为servlet过虑器的Java类必须实现javax.servlet.Filter接口。该接口由一对自描述的生命周期的方法init(FilterConfig)、destroy()和一个行为方法doFilter(ServletRequest,ServletResonse,FilterChain)。后者的设计看上去类似于doGet或者doPost。

下面是一个IP治理的servlet过滤器例子:

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 IPMonitorFilter implements Filter {

private FilterConfig config = null;

public void init(FilterConfig config) throws ServletException {

this.config = config;

}

public void destroy( ) {

this.config = null;

}

public void doFilter(ServletRequest request,

ServletResponse response,

FilterChain chain)

throws IOException, ServletException

{

if(config == null) {

return;

}

String legalIP = this.config.getInitParameter("LegalIP");

String thisIP = request.getRemoteAddr( );

if(legalIP.equals(thisIP)) {

chain.doFilter(request, response);

} else {

response.setContentType("text/Html");

PrintWriter out = response.getWriter( );

out.write("You are not allowed to connect " +

"to this URL at the moment. ");

}

}

}

将IPMonitorFilter放在servlet上的web.xml条目称为SecretServlet,可以写为如下:

<web-app><br>

<filter><br>

<filter-name>IPMonitorFilter</filter-name><br>

<filter-class>com.generationjava.tips.IPMonitorFilter</filter-class><br>

<init-param><br>

<param-name>LegalIP</param-name><br>

<param-value>192.168.13.15</param-value><br>

</init-param><br>

</filter><br>

<filter-mapping><br>

<filter-name>IPMonitorFilter</filter-name><br>

<url-pattern>/secret</url-pattern><br>

</filter-mapping><br>

<servlet><br>

<servlet-name>SecretServlet</servlet-name><br>

<servlet-class>com.generationjava.tips.SecretServlet</servlet-class><br>

</servlet><br>

<servlet-mapping><br>

<servlet-name>SecretServlet</servlet-name><br>

<url-pattern>/secret</url-pattern><br>

</servlet-mapping><br>

</web-app>

在上面的例子中,处理过滤的XML看上去与处理servlet的XML非常类似。当设置完成后,SecretServlet将只能被192.168.13.15的当地地址访问。当只答应一个内部用户访问这个页面或者对一个不同的ip地址给予其客户访问某个数据集的权限时,这种方法尤其有用。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航