zoukankan      html  css  js  c++  java
  • 利用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");
    
        }
    
    }
  • 相关阅读:
    趣题:寻找出现了奇数次的数
    zstu2016校赛圣杯战争
    HDU 5183 Negative and Positive (NP) ——(后缀和+手写hash表)
    HDU 5673 Robot ——(卡特兰数)
    HDU 3775 Chain Code ——(Pick定理)
    2016 ICPC北京站现场赛总结(再度流水账)
    2014苏州大学新生赛第二场(12.10)题目解析
    【Jump Game II 】cpp
    【Jump Game】cpp
    【 Sqrt(x) 】cpp
  • 原文地址:https://www.cnblogs.com/anranwuse/p/3630074.html
Copyright © 2011-2022 走看看