//ArgsIsValidFilter.java过滤器代码清单:
packagecom.hety.uitl;
importjava.io.IOException;
importjava.util.Enumeration;
importjavax.servlet.Filter;
importjavax.servlet.FilterChain;
importjavax.servlet.FilterConfig;
importjavax.servlet.ServletException;
importjavax.servlet.ServletRequest;
importjavax.servlet.ServletResponse;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importorg.apache.commons.logging.Log;
importorg.apache.commons.logging.LogFactory;
publicclassArgsIsValidFilterimplementsFilter{
privatestaticLoglog=LogFactory.getLog(ArgsIsValidFilter.class);
publicvoiddestroy(){
}
@SuppressWarnings("unchecked")
publicvoiddoFilter(ServletRequestarg0,ServletResponsearg1,FilterChainarg2)throwsIOException,ServletException{
HttpServletRequestrequest=(HttpServletRequest)arg0;
HttpServletResponseresponse=(HttpServletResponse)arg1;
Stringservername_str=request.getServerName();
StringcurrentURI=request.getRequestURI();
EnumerationheaderValues=request.getHeaders("Referer");
StringtmpHeaderValue="";
booleanisValid=true;
//指定需要跳过拦截的页面地址,如果需要新增,可直接在数组中添加。
//“建议”
String[]ignoreURIS={"/back/",
"/Info.jsp",
"/pzxx.jsp"
};
while(headerValues.hasMoreElements()){
//得到完整的路径:如“http://www.domain.com.cn:8023/front/zwgk/zwgk.jsp?id=1283”
tmpHeaderValue=(String)headerValues.nextElement();
}
if(log.isInfoEnabled()){
log.info("获得的参数url为:"+tmpHeaderValue);
log.info("系统取得的url为:"+currentURI);
}
if("".equals(tmpHeaderValue)){
isValid=false;
if(log.isInfoEnabled()){
log.info("获得的参数url为:empty");
log.info("系统取得的url为:"+currentURI);
log.info("系统提示:请求可能来自外域!");
}
}else{
if(log.isInfoEnabled()){
log.info("获得的参数长度为:"+tmpHeaderValue.length());
}
tmpHeaderValue=tmpHeaderValue.toLowerCase();
servername_str=servername_str.toLowerCase();
intlen=0;
if(tmpHeaderValue.startsWith("https://")){
len=8;
}elseif(tmpHeaderValue.startsWith("http://")){
len=7;
}
if(log.isInfoEnabled()){
log.info("截取前的字符串为:"+tmpHeaderValue);
log.info("从第"+len+"位开始截取,截取长度为:"+servername_str.length());
}
Stringtmp=tmpHeaderValue.substring(len,servername_str.length()+len);
if(log.isInfoEnabled()){
log.info("截取后的字符串为:"+tmp);
}
if(tmp.length()<servername_str.length()){//长度不够
isValid=false;
if(log.isInfoEnabled()){
log.info("截取后的字符串长度不够,请求可能来自外域!");
}
}elseif(!tmp.equals(servername_str)){//比较字符串(主机名称)是否相同
isValid=false;
if(log.isInfoEnabled()){
log.info("域名匹配失败,请求来自外域!");
}
}
}
//跳过指定需要拦截的页面地址
for(StringignoreURI:ignoreURIS){
if(currentURI.contains(ignoreURI)){
isValid=true;
if(log.isInfoEnabled()){
log.info("系统已跳过检查以下url:"+currentURI);
}
}
}
if(!isValid){
if(log.isInfoEnabled()){
log.info("系统提示信息:URL为跨域请求,即将重定向到首页。");
}
response.sendRedirect("/index.html");
}else{
arg2.doFilter(arg0,arg1);
}
}
publicvoidinit(FilterConfigarg0)throwsServletException{
}
}
|