java使用HttpSession實現QQ訪問記錄_java

來源:互聯網
上載者:User

java如何使用HttpSession實現QQ的訪問記錄,本文為大家揭曉答案,具體內容如下

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);

以上就是本文的全部內容,希望對大家的學習有所協助。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.