从百度搜索结果跳转到指定链接前,百度会发送一些参数,可以利用referer属性,在本站访问时记录百度跳转来之前的一些参数。
利用百度跳转前参数,进行一些相关的seo优化。
目前所用到的一些参数说明如下:
wd - 最终搜索词
bs - 前一次搜索词
tn - 到达搜索引擎的方式,如:baidu,直接打开,sitehao123,从123网站进入
f - 3:下拉框选择,8:用户自主搜索
oq - 用户输入搜索词(f=3时才会出现)
cl - 搜索类型(3-网页)
pn - 页数(页数*10)
inputT= 从打开百度主页,在对话框输入开始计时,到你点击搜索之间的时间。
filter代码如下:
import java.io.IOException; import java.net.URLDecoder; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.UUID; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * @author xuejt * 搜索引擎访问过滤器 */ public class KeyWordFilter implements Filter { /** * 要记录的搜索引擎域名 */ private static ArrayList<String> DOMAINLIST = null; /** * 需要转码的key列表 */ private static ArrayList<String> 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"); @Override public void destroy() { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, 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 < cookies.length) { // 判断当前cookie列表中是否有自己设定的cookie if (cookies[index].getName().equals(SEARCH_COOKIE_KEY)) { tmpCookie = cookies[index]; System.out.println("已有cookie - " + tmpCookie.getValue()); } index++; } if (tmpCookie == null) { // 如果没有自己设定的cookie,表示是新用户访问或cookie已过期 tmpCookie = new Cookie(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(new Date())); System.out.println("本次访问的ip - " + req.getLocalAddr()); System.out.println("************** cookie **************"); } } } } catch (Exception e) { e.printStackTrace(); } chain.doFilter(request, response); } @Override public void init(FilterConfig arg0) throws ServletException { /* * 增加要捕获域名 */ DOMAINLIST = new ArrayList<String>(); DOMAINLIST.add("www.baidu.com"); /* * 增加要转码的参数名 */ DECODEWORDLIST = new ArrayList<String>(); DECODEWORDLIST.add("wd"); DECODEWORDLIST.add("bs"); DECODEWORDLIST.add("oq"); } }