程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> JavaWeb中Session對象的進修筆記

JavaWeb中Session對象的進修筆記

編輯:關於JAVA

JavaWeb中Session對象的進修筆記。本站提示廣大學習愛好者:(JavaWeb中Session對象的進修筆記)文章只能為提供參考,不一定能成為您想要的結果。以下是JavaWeb中Session對象的進修筆記正文


1、Session簡略引見

  在WEB開辟中,辦事器可認為每一個用戶閱讀器創立一個會話對象(session對象),留意:一個閱讀器獨有一個session對象(默許情形下)。是以,在須要保留用戶數據時,辦事器法式可以把用戶數據寫到用戶閱讀器獨有的session中,當用戶應用閱讀器拜訪其它法式時,其它法式可以從用戶的session中掏出該用戶的數據,為用戶辦事。

2、Session和Cookie的重要差別

Cookie是把用戶的數據寫給用戶的閱讀器。
Session技巧把用戶的數據寫到用戶獨有的session中。
Session對象由辦事器創立,開辟人員可以挪用request對象的getSession辦法獲得session對象。

3、session完成道理

3.1、辦事器是若何完成一個session為一個用戶閱讀器辦事的?

   辦事器創立session出來後,會把session的id號,以cookie的情勢回寫給客戶機,如許,只需客戶機的閱讀器不關,再去拜訪辦事器時,都邑帶著session的id號去,辦事器發明客戶機閱讀器帶session id過去了,就會應用內存中與之對應的session為之辦事。可以用以下的代碼證實:

package xdp.gacl.session;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class SessionDemo1 extends HttpServlet {

  public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

    response.setCharacterEncoding("UTF=8");
    response.setContentType("text/html;charset=UTF-8");
    //應用request對象的getSession()獲得session,假如session不存在則創立一個
    HttpSession session = request.getSession();
    //將數據存儲到session中
    session.setAttribute("data", "孤獨蒼狼");
    //獲得session的Id
    String sessionId = session.getId();
    //斷定session是否是新創立的
    if (session.isNew()) {
      response.getWriter().print("session創立勝利,session的id是:"+sessionId);
    }else {
      response.getWriter().print("辦事器曾經存在該session了,session的id是:"+sessionId);
    }
  }

  public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    doGet(request, response);
  }
}

  第一次拜訪時,辦事器會創立一個新的sesion,而且把session的Id以cookie的情勢發送給客戶端閱讀器,以下圖所示:

  點擊刷新按鈕,再次要求辦事器,此時便可以看到閱讀器再要求辦事器時,會把存儲到cookie中的session的Id一路傳遞到辦事器端了,以下圖所示:

  我料想request.getSession()辦法外部新創立了Session以後必定是做了以下的處置

//獲得session的Id
String sessionId = session.getId();
//將session的Id存儲到名字為JSESSIONID的cookie中
Cookie cookie = new Cookie("JSESSIONID", sessionId);
//設置cookie的有用途徑
cookie.setPath(request.getContextPath());
response.addCookie(cookie);

4、閱讀器禁用Cookie後的session處置

4.1、IE8禁用cookie

  對象->internet選項->隱私->設置->將滑軸拉到最頂上(阻攔一切cookies)
4.2、處理計劃:URL重寫

  response.encodeRedirectURL(java.lang.String url) 用於對sendRedirect辦法後的url地址停止重寫。
  response.encodeURL(java.lang.String url)用於對表單action和超鏈接的url地址停止重寫

4.3、典范:禁用Cookie後servlet同享Session中的數據

IndexServlet

package xdp.gacl.session;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//首頁:列出一切書
public class IndexServlet extends HttpServlet {

  public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();
    //創立Session
    request.getSession();
    out.write("本網站有以下書:<br/>");
    Set<Map.Entry<String,Book>> set = DB.getAll().entrySet();
    for(Map.Entry<String,Book> me : set){
      Book book = me.getValue();
      String url =request.getContextPath()+ "/servlet/BuyServlet?id=" + book.getId();
      //response. encodeURL(java.lang.String url)用於對表單action和超鏈接的url地址停止重寫
      url = response.encodeURL(url);//將超鏈接的url地址停止重寫
      out.println(book.getName() + "  <a href='"+url+"'>購置</a><br/>");
    }
  }

  public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    doGet(request, response);
  }
}


/**
 * @author gacl
 * 模仿數據庫
 */
class DB{
  private static Map<String,Book> map = new LinkedHashMap<String,Book>();
  static{
    map.put("1", new Book("1","javaweb開辟"));
    map.put("2", new Book("2","spring開辟"));
    map.put("3", new Book("3","hibernate開辟"));
    map.put("4", new Book("4","struts開辟"));
    map.put("5", new Book("5","ajax開辟"));
  }
  
  public static Map<String,Book> getAll(){
    return map;
  }
}

class Book{
  
  private String id;
  private String name;

  public Book() {
    super();
  }
  public Book(String id, String name) {
    super();
    this.id = id;
    this.name = name;
  }
  public String getId() {
    return id;
  }
  public void setId(String id) {
    this.id = id;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
}

BuyServlet

package xdp.gacl.session;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class BuyServlet extends HttpServlet {

  public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    String id = request.getParameter("id");
    Book book = DB.getAll().get(id); //獲得用戶想買的書
    HttpSession session = request.getSession();
    List<Book> list = (List) session.getAttribute("list"); //獲得用戶用於保留一切書的容器
    if(list==null){
      list = new ArrayList<Book>();
      session.setAttribute("list", list);
    }
    list.add(book);
    //response. encodeRedirectURL(java.lang.String url)用於對sendRedirect辦法後的url地址停止重寫
    String url = response.encodeRedirectURL(request.getContextPath()+"/servlet/ListCartServlet");
    System.out.println(url);
    response.sendRedirect(url);
  }

  public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    doGet(request, response);
  }

}

ListCartServlet

package xdp.gacl.session;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class ListCartServlet extends HttpServlet {

  public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();
    HttpSession session = request.getSession();
    List<Book> list = (List) session.getAttribute("list");
    if(list==null || list.size()==0){
      out.write("對不起,您還沒有購置任何商品!!");
      return;
    }
    
    //顯示用戶買過的商品
    out.write("您買過以下商品:<br>");
    for(Book book : list){
      out.write(book.getName() + "<br/>");
    }
  }

  public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    doGet(request, response);
  }
}

  在禁用了cookie的IE8下的運轉後果以下:

演示後果

  經由過程檢查IndexServlet生成的html代碼可以看到,每個超鏈接前面都帶上了session的Id,以下所示

//本網站有以下書:
<br/>javaweb開辟  
<a href='/JavaWeb_Session_Study_20140720/servlet/BuyServlet;jsessionid=96BDFB9D87A08D5AB1EAA2537CDE2DB2?id=1'>購置</a><br/>
//spring開辟  
<a href='/JavaWeb_Session_Study_20140720/servlet/BuyServlet;jsessionid=96BDFB9D87A08D5AB1EAA2537CDE2DB2?id=2'>購置</a><br/>
// hibernate開辟  
<a href='/JavaWeb_Session_Study_20140720/servlet/BuyServlet;jsessionid=96BDFB9D87A08D5AB1EAA2537CDE2DB2?id=3'>購置</a><br/>
//struts開辟  
<a href='/JavaWeb_Session_Study_20140720/servlet/BuyServlet;jsessionid=96BDFB9D87A08D5AB1EAA2537CDE2DB2?id=4'>購置</a><br/>
//ajax開辟  
<a href='/JavaWeb_Session_Study_20140720/servlet/BuyServlet;jsessionid=96BDFB9D87A08D5AB1EAA2537CDE2DB2?id=5'>購置</a><br/>

  所以,當閱讀器禁用了cookie後,便可以用URL重寫這類處理計劃處理Session數據同享成績。並且response. encodeRedirectURL(java.lang.String url) 和response. encodeURL(java.lang.String url)是兩個異常智能的辦法,當檢測到閱讀器沒有禁用cookie時,那末就不停止URL重寫了。我們在沒有禁用cookie的火狐閱讀器下拜訪,後果以下:

  從演示動畫中可以看到,閱讀器第一次拜訪時,辦事器創立Session,然後將Session的Id以Cookie的情勢發送回給閱讀器,response. encodeURL(java.lang.String url)辦法也將URL停止了重寫,當點擊刷新按鈕第二次拜訪,因為火狐閱讀器沒有禁用cookie,所以第二次拜訪時帶上了cookie,此時辦事器便可以曉得以後的客戶端閱讀器並沒有禁用cookie,那末就告訴response. encodeURL(java.lang.String url)辦法不消將URL停止重寫了。

5、session對象的創立和燒毀機會

5.1、session對象的創立機會

  在法式中第一次挪用request.getSession()辦法時就會創立一個新的Session,可以用isNew()辦法來斷定Session是否是新創立的

典范:創立session

//應用request對象的getSession()獲得session,假如session不存在則創立一個
HttpSession session = request.getSession();
//獲得session的Id
String sessionId = session.getId();
//斷定session是否是新創立的
if (session.isNew()) {
  response.getWriter().print("session創立勝利,session的id是:"+sessionId);
}else {
  response.getWriter().print("辦事器曾經存在session,session的id是:"+sessionId);
}

5.2、session對象的燒毀機會

  session對象默許30分鐘沒有應用,則辦事器會主動燒毀session,在web.xml文件中可以手工設置裝備擺設session的掉效時光,例如:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
  xmlns="http://java.sun.com/xml/ns/javaee" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
  http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
 <display-name></display-name>
 
 <welcome-file-list>
  <welcome-file>index.jsp</welcome-file>
 </welcome-file-list>

 <!-- 設置Session的有用時光:以分鐘為單元-->
  <session-config>
    <session-timeout>15</session-timeout>
  </session-config>

</web-app>

  當須要在法式中手動設置Session掉效時,可以手工挪用session.invalidate辦法,摧毀session。

1 HttpSession session = request.getSession();
2 //手工挪用session.invalidate辦法,摧毀session
3 session.invalidate();

以上就是本文的全體內容,願望對年夜家進修session有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved