利用referer属性,记录百度搜索跳转参数

从百度搜索结果跳转到指定链接前,百度会发送一些参数,可以利用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");

    }

}
原文地址:https://www.cnblogs.com/anranwuse/p/3630074.html