如果你想安装一个带有访问限制的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地址给予其客户访问某个数据集的权限时,这种方法尤其有用。
闽公网安备 35060202000074号