因公司需要,内部网站要求只能通过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 这样写居然不匹配,,也不知道是我写错了,还是它根本就不支持。。。。