Tomcat6 限制来源URL

本文介绍如何使用Tomcat的自定义阀门来实现对特定来源的HTTP请求进行限制,包括基于IP和域名的访问控制。

因公司需要,内部网站要求只能通过OA登录,所以要做限制,服务器上做的是apache+tomcat环境

经测试,由Tomcat负责解析的部份,apache的httpd服务器什么都不管,尽管我对那个目录做了限制。它也不理。

所以,只好打Tomcat的注意了,,,嘿

于是上网搜索到解决方案如下:

 

****************************************************

 

<Context path="/weba" debug="0" privileged="true" reloadable="true"

 docBase="weba">

 <Valve className="org.apache.catalina.valves.RemoteHostValve" 

 allow="192.168.*.*"/> 

 <Valve className="org.apache.catalina.valves.RemoteAddrValve" 

 deny="192.168.*.*"/> 

</Context>

其实还可以用域名,类似如下:

 <Context path="/examples" ...> 

 ... 

 <Valve className="org.apache.catalina.valves.RemoteHostValve" 

 allow="*.mycompany.com,www.yourcompany.com"/> 

 <Valve className="org.apache.catalina.valves.RemoteAddrValve" 

 deny="192.168.*.*"/> 

 ... 

 </Context>

 

****************************************************

 

我以为RemoteHostValve就是限制来源URL的,因为上面写的是域名,于是杯具了。。。

上面代码经测试,,只能限制IP,查看RemoteHostValve源码可知,它获取的是request.getRequest().getRemoteHost() 并不是我所想像的request.getHeader("referer")

 

所以,只能自己写一个valves了,可是我又懒,于是又在网上搜到如下代码:

 

package org.apache.catalina.valves;

 

import java.io.*;

import javax.servlet.*;

 

import org.apache.catalina.connector.*;

 

/**

 * <p>

 * Title: Request Header Filter For Tomcat

 * </p>

 * <p>

 * Description: eg: set follow coment in ${catalina.home}/conf/server.xml:

 * <Valve className="org.apache.catalina.valves.RequestHeaderValve"

 * header="User-Agent" deny="*httunit*"/> then you can forbidden someone use

 * httpunit to Access the Engine ,Host or Context or: <Valve

 * className="org.apache.catalina.valves.RequestHeaderValve" header="Referer"

 * deny="*.mydomain.com, *localhost*"/> then you can forbidden someone open the

 * link from *.mydomain.com or localhost

 * </p>

 * <p>

 * Copyright: Apache License Version 2.0

 * </p>

 * <p>

 * Company: lizongbo

 * </p>

 * 

 * @author lizongbo @ gmail.com

 * @version 1.0

 */

public final class RequestHeaderValve extends RequestFilterValve {

private String header = "";

 

public void invoke(Request request, Response response) throws IOException,

ServletException {

String headervalue = request.getRequest().getHeader(getHeader());

headervalue = headervalue != null ? headervalue : "";

process(headervalue, request, response);

}

 

public String getHeader() {

return header;

}

 

public void setHeader(String header) {

this.header = header;

}

}

 

 

将上面代码编译后,复制到%TOMCAT_HOME%/lib/org/apache/catalina/valves 目录内

 

然后要配置虚拟主机

 

server.xml 部分配置样例如下:

 

<Host name="www.faw-logi.com" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">

 

       <Alias>faw-logi.com</Alias>

       <Alias>faw-wl.com</Alias>

       <Alias>www.faw-wl.com</Alias>

       <Alias>faw-logistics.com</Alias>

       <Alias>www.faw-logistics.com</Alias>

   <Context path="" docBase="x:/xxx/www.faw-logi.com" />

   <Context path="/xxxx" docBase="x:/xxx/peixun.faw-logi.com">

<Valve className="org.apache.catalina.valves.RequestHeaderValve" allow="[/S]*faw-[/S]*" header="referer"/>

   </Context>

      </Host>

 

注意上面配置中的:header="referer"  referer也可以改成别的,只要是header信息里的就OK,,这样很灵活吧。。呵呵,不过这代码可不是我写的

代码来源地址:http://www.360doc.com/content/05/0830/10/717_9339.shtml

 

重启tomcat,测试,,搞定,,哈哈,折腾了一天,终于有结果了。。。

 

另外,JAVA的正则中 ^http://xxx  这样写居然不匹配,,也不知道是我写错了,还是它根本就不支持。。。。

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值