程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> JavaWeb Session 會話治理實例詳解

JavaWeb Session 會話治理實例詳解

編輯:關於JAVA

JavaWeb Session 會話治理實例詳解。本站提示廣大學習愛好者:(JavaWeb Session 會話治理實例詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是JavaWeb Session 會話治理實例詳解正文


Session會話簡介

會話是指在一段時光內,用戶應用統一個閱讀器過程與Web運用之間的交互進程。

會話(Session)平日用來跟蹤用戶的狀況,緩存用戶在此閱讀器過程中的信息。

當用戶封閉閱讀器,上一個Session也就沒法再次取得了(Cookie的maxAge為-1的情形)。再次翻開新的閱讀器,將開端一個新的會話。

類javax.servlet.http.HttpSession。每個HttpSession代表用戶的一個會話。
每個Session的過時時光默許為30分鐘。

當閱讀器第一次拜訪辦事器時,不管先拜訪哪個頁面,辦事器就會給用戶分派一個獨一的會話標識,即jsessionid然後以cookie的情勢前往給用戶。
下圖是一個呼應頭(下圖是基於Servlet3.0的,在Servlet2.5中沒有HttpOnly屬性)

辦事器給每一個用戶創立一個會話,即HttpSession對象,保留在辦事器端。

那末,當用戶再次拜訪辦事器時,辦事器是若何曉得照樣以後用戶呢?

當閱讀器再次拜訪辦事器時,會攜帶包括了jsessionid的cookie拜訪辦事器。辦事器依據此id前往此用戶的HttpSession對象,就堅持了會話。
( 那末,能否可以在分歧的閱讀器上完成統一個統一個會話呢?

上面是一個典范的URL,它帶有必定的誘騙感化,可以在分歧的閱讀器上完成統一個會話:

http://localhost:8080/day07_2/CNCookieServlet;jsessionid=F8692D61CD46D094DBB7A8FC7387649C )

閱讀器和辦事器的關系以下兩圖:


HttpSession:

在Servlet中,經由過程HttpServletRequest.getSession辦法獲得會話對像。

HttpSession接口的以下辦法用於向會話規模內同享數據:

getAttribute(“name”)
setAttribute(“name”,object);
getAttributeNames()
removeAttrubute(“name”)

Invalidate(); - 此辦法強力刪除辦事器緩存的session.

示例:

在一個Servlet的向httpSession中setAttribute設置某些值。

經由過程超銜接,或其他方法轉到其他servlet並經由過程getAttribute顯示信息。

在隨意率性Servlet中挪用getAttribute顯示信息。

封閉此閱讀器,從新拜訪獲得信息的servlet,你會發明曾經沒有信息了。

以下:

String name=request.getParameter("name"); 
request.setAttribute("name", "request---"+name); 
request.getSession().setAttribute("name", "session---"+name); 
getServletContext().setAttribute("name", "application---"+name); 

Session的獨一標識Id:

每個Session都一個獨一標識,即ID。

當閱讀器獲得一個新的Session時,用戶便可以經由過程session.geId();打印出ID的值 。

在不封閉閱讀器的情形下,在多個頁面上跳轉,應用的是統一個Session。

如:

request.getSession().getId() 

作甚平安加入:

用戶加入時,應當當將本身的信息從Session中消除-即平安加入。

平安加入是為了將本身在辦事器上留下的信息消除清潔,以防被黑

Session.invalidate();

1、request.getSession().invalidate();

如斯可將session池中的絕對應的對象刪除

2、Session.removeAttribute(…)

如:

request.getSession().removeAttribute("realCode");

用於刪除session對象中的屬性

經由過程重寫URL來跟蹤會話:

後面曾經說過,Servlet容器先在客戶端保留一個SessionID,今後,在閱讀器收回HTTP要求時,都邑包括這個SessionID.Servlet容器讀取HTTP要求中的這個SessionID,依據這個SessionID自在器中掏出HttpSession對像,以便於跟蹤HTTP要求屬於哪個會話,這一進程稱為會話的跟蹤。

假如閱讀器支撐Cookie,Servlet容器就將SessionID作為Cookie保留在閱讀器的客戶端。但假如出於平安的斟酌,用戶禁用了Cookie,那末Servlet容器又若何來跟蹤會話呢?

起首讓我們在IE中禁用Cookie(留意:關於某些GHOST的體系不起感化)。

IE>對象>Internet選項>隱私>高等,然後禁用Cookie:

我們可以在主頁加上如許的超鏈接:(與上面代碼中相干的SaveServlet.java GetServlet.java LogoutServlet.java的代碼我放在最初面貼)

<h2>演示重寫url技巧---破解用戶禁用cookie以後,我們session有效的成績</h2> 
<form action="<%=response.encodeURL("saveServlet") %>" method="post"> 
name:<input type="text" name="name"/><br/> 
<input type="submit"/> 
</form> 
<a href="<%=response.encodeURL("getServlet") %>">重寫url-讀取幾個容器中的數據</a><br/> 
<a href="<%=response.encodeURL("logoutServlet") %>">重寫url-平安加入</a> 

這句<form action=“<%=response.encodeURL(“/aa”)%>”>便可以完成這一功效

在這裡禁用了cookie今後,閱讀器依然可以或許吸收到辦事器發送過去的cookie,然則閱讀器只能接收不克不及發送出去給辦事器,不克不及發送cookie的話也就不克不及夠去session池中去取響應的對象了。

下面的代碼在表單外面輸出想要的值以後,再到上面的getServlet這裡的超鏈接處拜訪看是否是依然可以或許顯示出輸出的值,謎底是確定的。這裡的拜訪途徑就相當於相似

http://localhost:8080/day07_2/CNCookieServlet;jsessionid=F8692D61CD46D094DBB7A8FC7387649C 的,前面帶的jsessionid=F8692D61CD46D094DBB7A8FC7387649C就是其id,如斯,你到另外一個閱讀器中去輸出這個網址也可以或許拜訪的到。
這裡我要彌補一下:(以下情形是在我將session池中HttpSession對象將對應session的JSESSIONID值和value值寫入cookie中,這個cookie會籠罩體系造的誰人,就相當因而我本身造的,我將存在時光設置成了非常鐘,假如不籠罩的話,cookie在閱讀器封閉時就會滅亡,上面的景象也就不會湧現了)

在能否禁用了cookie這兩種情形下在session池中新建的對象的id是紛歧樣的,即假設你在禁用了cookie時在表單中輸出了一個name的值,查詢成果以下:

而且jsessionid為2BB51EBDEAAF14D19656C71E1B6F9FF6

然後立時換成不由用cookie形式,輸出另外一個名字如Tom,查詢成果天然會是兩個Tom,jsessionid為

203F9E4DB5D874476B81DAF350661B6A,與禁用是紛歧樣,這就使湧現上面的成果了

然後此時我們將閱讀器封閉,再次進入閱讀器,在不由用cookie形式下檢查拜訪成果,以下:

上面我將重要的代碼貼下去:

SaveServlet.java

package cn.hncu.servlets.session; 
import java.io.IOException; 
import java.io.PrintWriter; 
import javax.servlet.ServletException; 
import javax.servlet.http.Cookie; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
public class SaveServlet extends HttpServlet { 
public void doGet(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException { 
doPost(request, response); 
} 
public void doPost(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException { 
response.setContentType("text/html;charset=utf-8"); 
PrintWriter out = response.getWriter(); 
request.setCharacterEncoding("utf-8"); 
String name=request.getParameter("name"); 
request.setAttribute("name", "request---"+name); 
request.getSession().setAttribute("name", "session---"+name); 
getServletContext().setAttribute("name", "application---"+name); 
//把cookie技巧和session技巧結合起來做運用的一個例子---※功效:讓用戶在封閉閱讀器以後,假如10分鐘以內可以或許登錄本站,還能拜訪到session中的信息 
//向客戶端寫一個key為"JSESSIONID"用value為sessionid的cookie, 
Cookie c=new Cookie("JSESSIONID", request.getSession().getId()); 
c.setMaxAge(60*10);//下面的景象就是這一句形成的,沒有這一句的話就不會有下面說的景象了 
c.setPath(request.getContextPath()); 
response.addCookie(c); 
out.println("保留勝利..."); 
out.flush(); 
out.close(); 
} 
}

GetServlet.java

package cn.hncu.servlets.session; 
import java.io.IOException; 
import java.io.PrintWriter; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
public class GetServlet extends HttpServlet { 
public void doGet(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException { 
response.setContentType("text/html;charset=utf-8"); 
PrintWriter out = response.getWriter(); 
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"); 
out.println("<HTML>"); 
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>"); 
out.println(" <BODY>"); 
String reqName=(String) request.getAttribute("name"); 
String seName=(String) request.getSession().getAttribute("name"); 
String appName=(String) getServletContext().getAttribute("name"); 
out.println(reqName+"<br/>"); 
out.println(seName+"<br/>"); 
out.println(appName+"<br/>"); 
out.println(" </BODY>"); 
out.println("</HTML>"); 
out.flush(); 
out.close(); 
} 
}

LogoutServlet.java

package cn.hncu.servlets.session; 
import java.io.IOException; 
import java.io.PrintWriter; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
public class LogoutServlet 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().invalidate(); 
out.println("已平安加入..."); 
} 
} 

以上所述是小編給年夜家引見的JavaWeb Session 會話治理,願望對年夜家有所贊助,假如年夜家有任何疑問迎接給我留言,小編會實時答復年夜家的!

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