java學習筆記—使用HttpSession實現QQ的訪問記錄(31)

來源:互聯網
上載者:User

標籤:

1. 編寫QQ空間資料類(QQS.java)

public class QQS {    private static LinkedHashMap<Integer, String> qqs = new LinkedHashMap<Integer, String>();    static{        qqs.put(10001, "張三");        qqs.put(10002, "李四");        qqs.put(10003, "王五");        qqs.put(10004, "趙六");        qqs.put(10005, "田七");        qqs.put(10006, "焦八");        qqs.put(10007, "侯九");        qqs.put(10008, "柳十");        qqs.put(10009, "小二");    }    public static LinkedHashMap<Integer, String> getQqs() {        return qqs;    }}

2. 編寫一個現實QQ資料和瀏覽記錄的頁面(ListServlet.java)

public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {        // 擷取Session對象        HttpSession session = request.getSession();        // 設定中文資料        response.setCharacterEncoding("utf-8");        response.setContentType("text/html;charset=utf-8");        // 擷取輸出資料流        PrintWriter out = response.getWriter();        // 擷取QQS資料        LinkedHashMap<Integer, String> qqs = QQS.getQqs();        Set<Map.Entry<Integer, String>> set = qqs.entrySet();        Iterator<Map.Entry<Integer, String>> it = set.iterator();        // 輸出頁面結構        out.println("<html><head><title>QQ列表</title><style>a{margin-right:20px;}</style></head><body>");        out.println("<hr/><br/>");        out.println("<h3>QQ列表</h3>");        out.println("<hr/><br/>");        // 迴圈輸出QQ空間的超連結        while(it.hasNext()){          Map.Entry<Integer, String> entry = it.next();          Integer num = entry.getKey();          String name = entry.getValue();          out.println("<a href=\"/day08/store?num="+num+"\">"+name+"</a>");        }        // 輸出瀏覽的記錄資訊        out.println("<hr/><br/>");        out.println("<h3>QQ瀏覽記錄</h3>");        out.println("<hr/><br/>");        // 擷取訪問記錄資料        String history = (String) session.getAttribute("history");        if(history == null){            out.println("<font color=\"red\">對不起,目前沒有訪問記錄...</font>");        }else{            // 迴圈遍曆使用者訪問的記錄資料            String[] nums = history.split(",");            for(String num:nums){                String name = QQS.getQqs().get(Integer.parseInt(num));                out.println(name+" ,");            }        }        // 關閉頁面結構        out.println("</body></html>");    }

3. 編寫一個儲存瀏覽QQ空間的頁面(StoreQQServlet.java)

public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {        // 擷取Session對象        HttpSession session = request.getSession(false);        // 擷取請求參數        String num = request.getParameter("num");        // 擷取Session中的資料        String history = (String) session.getAttribute("history");        // 判斷資料        if(history == null){            // 第一次訪問            session.setAttribute("history", num);    // history=10001        }else{            // 訪問多次            session.setAttribute("history", history+","+num);            // 設定num的數量和顯示的順序            String[] qqs = history.split(",");            // 將數群組轉換為方便操作的集合            List<String> list = Arrays.asList(qqs);            // 將List轉換為LinkedList便於操作資料            LinkedList<String> linked_list = new LinkedList<String>();            linked_list.addAll(list);            // 判斷出現的QQ次數            if(qqs.length < 3 ){                if(linked_list.contains(num)){  // history=10002,1003                       // 如果包含                    linked_list.remove(num);                    linked_list.addFirst(num);                }else{                         // history=1004,10002,1003                        // 不包含                     linked_list.addFirst(num);                }            }else{   // >= 3                if(linked_list.contains(num)){  // history=10002,10003,10004   10004                     // 如果包含                    linked_list.remove(num);                    linked_list.addFirst(num);                }else{                         // history= 10005 ,10002,10003                          // 不包含                     linked_list.removeLast();                    linked_list.addFirst(num);                }            }            // 次數好了,順序好了的訪問記錄linked_list            StringBuffer sb = new StringBuffer();            for(String new_num:linked_list){                sb.append(new_num+",");            }            String new_history = sb.toString();            session.setAttribute("history", new_history);        }        // 重新導向到QQ列表頁面        response.sendRedirect("/day08/list");    }

以上的代碼將使用者的瀏覽記錄儲存在了session對象中,但是該對象是在伺服器記憶體中的,且有有效時間限制,如果時間到了,那麼session就會被銷毀。

預設的時間為半個小時(30分鐘)。

4  配置Session的有效時間

在每一個網站的web.xml中可以配置該網站建立的session對象的有效時間。注意的是配置時單位是分鐘。

Thread.slessp(毫秒單位)、Cookie.setMaxAge(秒單位)、session(分鐘單位)

  <session-config>    <session-timeout>2</session-timeout>        ? 單位是分鐘  </session-config>

5  Cookie的禁用

Cookie可以利用用戶端儲存會話資料。

HttpSession可以利用Cookie儲存SessionID資訊。

其實在瀏覽器的設定中可以拒絕網站發送回來的Cookie資訊。

 

此時再訪問以上的案例就會導致null 指標異常出現。如果需要將網站修複,那麼必須使用URLRewriting技術。

URLRewritting

分析以上問題的原因:

伺服器建立好了Session對象,但是由於瀏覽器禁止了Cookie的接收,那麼伺服器無法將建立好的Session的ID值以Set-Cookie的回應標頭方式發送給瀏覽器進行儲存,那麼在第二訪問的時候也就不會懈怠SessionID,因此無法找到Session。

常用的方法

String encodeRedirectURL(String url)     ? 給指定的重新導向路徑後添加Sessionid資訊String encodeURL(String url)            ? 給普通的URL地址添加Sessionid資訊

實施的原則:

“將頁面中的所有的URL地址全部使用以上方法進行重新編碼”

1 修改以上程式

1 ListServlet.java

String path = "/day08/store?num="+num;  path = response.encodeURL(path);  out.println("<a href=‘"+path+"‘>"+name+"</a>");

2. StoreQQServlet.java

String path = "/day08/list";path = response.encodeRedirectURL(path);response.sendRedirect(path);

 

java學習筆記—使用HttpSession實現QQ的訪問記錄(31)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.