importjava.io.IOException;importjava.net.URLDecoder;importjava.text.SimpleDateFormat;importjava.util.ArrayList;importjava.util.Date;importjava.util.UUID;importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjavax.servlet.FilterConfig;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;importjavax.servlet.http.Cookie;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;/***@authorxuejt
* 搜索引擎访问过滤器*/
public class KeyWordFilter implementsFilter {/*** 要记录的搜索引擎域名*/
private static ArrayList DOMAINLIST = null;/*** 需要转码的key列表*/
private static ArrayList DECODEWORDLIST = null;/*** 自定义记录cookie名*/
private static final String SEARCH_COOKIE_KEY = "search_cookie";/*** 自定义cookie过期时间*/
private static final int COOKIE_MAX_AGE= 1440;private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Overridepublic voiddestroy() {
}
@Overridepublic voiddoFilter(ServletRequest request, ServletResponse response,
FilterChain chain)throwsIOException, ServletException {try{
HttpServletRequest req=(HttpServletRequest) request;
HttpServletResponse res=(HttpServletResponse) response;//获取referer
String referer = req.getHeader("referer");//循环过滤域名
for(String domain : DOMAINLIST) {if (null != referer &&referer.contains(domain)) {//如果是从指定域名跳转到本站时,需要记录跳转前参数
System.out.println("************** param **************");if (referer.contains("?")) {
String[] searchParams= referer.substring(referer.indexOf("?") + 1).split("&");
String[] p= null;for(String param : searchParams) {
p= param.split("=");//判断当前参数是否需要中文转码
if (DECODEWORDLIST.contains(p[0])) {
p[1] = URLDecoder.decode(p[1], "UTF-8");
}
System.out.println(p[0] + " - " + p[1]);
}
}
System.out.println("************** param **************");
System.out.println();//获取当前访问的cookie列表
Cookie[] cookies =req.getCookies();if (cookies != null && cookies.length > 0) {
System.out.println("************** cookie **************");int index = 0;
Cookie tmpCookie= null;while (tmpCookie == null && index
if(cookies[index].getName().equals(SEARCH_COOKIE_KEY)) {
tmpCookie=cookies[index];
System.out.println("已有cookie - " +tmpCookie.getValue());
}
index++;
}if (tmpCookie == null) {//如果没有自己设定的cookie,表示是新用户访问或cookie已过期
tmpCookie = newCookie(SEARCH_COOKIE_KEY, UUID.randomUUID().toString());
tmpCookie.setMaxAge(COOKIE_MAX_AGE);//设置cookie过期时间
res.addCookie(tmpCookie);
System.out.println("设置新cookie - " +tmpCookie.getValue());
}
System.out.println("本次访问时间 - " + sdf.format(newDate()));
System.out.println("本次访问的ip - " +req.getLocalAddr());
System.out.println("************** cookie **************");
}
}
}
}catch(Exception e) {
e.printStackTrace();
}
chain.doFilter(request, response);
}
@Overridepublic void init(FilterConfig arg0) throwsServletException {/** 增加要捕获域名*/DOMAINLIST= new ArrayList();
DOMAINLIST.add("www.baidu.com");/** 增加要转码的参数名*/DECODEWORDLIST= new ArrayList();
DECODEWORDLIST.add("wd");
DECODEWORDLIST.add("bs");
DECODEWORDLIST.add("oq");
}
}