欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaWeb Session 會(huì)話管理實(shí)例詳解

 更新時(shí)間:2016年09月18日 13:49:50   作者:隨新小雅  
這篇文章主要介紹了JavaWeb Session 會(huì)話管理的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起看看吧

Session會(huì)話簡(jiǎn)介

會(huì)話是指在一段時(shí)間內(nèi),用戶使用同一個(gè)瀏覽器進(jìn)程與Web應(yīng)用之間的交互過(guò)程。

會(huì)話(Session)通常用來(lái)跟蹤用戶的狀態(tài),緩存用戶在此瀏覽器進(jìn)程中的信息。

當(dāng)用戶關(guān)閉瀏覽器,上一個(gè)Session也就無(wú)法再次獲得了(Cookie的maxAge為-1的情況)。再次打開(kāi)新的瀏覽器,將開(kāi)始一個(gè)新的會(huì)話。

類javax.servlet.http.HttpSession。每一個(gè)HttpSession代表用戶的一個(gè)會(huì)話。
每一個(gè)Session的過(guò)期時(shí)間默認(rèn)為30分鐘。

當(dāng)瀏覽器第一次訪問(wèn)服務(wù)器時(shí),無(wú)論先訪問(wèn)哪一個(gè)頁(yè)面,服務(wù)器就會(huì)給用戶分配一個(gè)唯一的會(huì)話標(biāo)識(shí),即jsessionid然后以cookie的形式返回給用戶。
下圖是一個(gè)響應(yīng)頭(下圖是基于Servlet3.0的,在Servlet2.5中沒(méi)有HttpOnly屬性)

服務(wù)器給每個(gè)用戶創(chuàng)建一個(gè)會(huì)話,即HttpSession對(duì)象,保存在服務(wù)器端。

那么,當(dāng)用戶再次訪問(wèn)服務(wù)器時(shí),服務(wù)器是如何知道還是當(dāng)前用戶呢?

當(dāng)瀏覽器再次訪問(wèn)服務(wù)器時(shí),會(huì)攜帶包含了jsessionid的cookie訪問(wèn)服務(wù)器。服務(wù)器根據(jù)此id返回此用戶的HttpSession對(duì)象,就保持了會(huì)話。
( 那么,是否可以在不同的瀏覽器上實(shí)現(xiàn)同一個(gè)同一個(gè)會(huì)話呢?

下面是一個(gè)典型的URL,它帶有一定的欺騙作用,可以在不同的瀏覽器上實(shí)現(xiàn)同一個(gè)會(huì)話:

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

瀏覽器和服務(wù)器的關(guān)系如下兩圖:


HttpSession:

在Servlet中,通過(guò)HttpServletRequest.getSession方法獲取會(huì)話對(duì)像。

HttpSession接口的以下方法用于向會(huì)話范圍內(nèi)共享數(shù)據(jù):

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

Invalidate(); - 此方法強(qiáng)力刪除服務(wù)器緩存的session.

示例:

在一個(gè)Servlet的向httpSession中setAttribute設(shè)置某些值。

通過(guò)超連接,或其他方式轉(zhuǎn)到其他servlet并通過(guò)getAttribute顯示信息。

在任意Servlet中調(diào)用getAttribute顯示信息。

關(guān)閉此瀏覽器,重新訪問(wèn)獲取信息的servlet,你會(huì)發(fā)現(xiàn)已經(jīng)沒(méi)有信息了。

如下:

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

Session的唯一標(biāo)識(shí)Id:

每一個(gè)Session都一個(gè)唯一標(biāo)識(shí),即ID。

當(dāng)瀏覽器獲取一個(gè)新的Session時(shí),用戶即可以通過(guò)session.geId();打印出ID的值 。

在不關(guān)閉瀏覽器的情況下,在多個(gè)頁(yè)面上跳轉(zhuǎn),使用的是同一個(gè)Session。

如:

request.getSession().getId() 

何為安全退出:

用戶退出時(shí),應(yīng)該當(dāng)將自己的信息從Session中清除-即安全退出。

安全退出是為了將自己在服務(wù)器上留下的信息清除干凈,以防被黑

Session.invalidate();

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

如此可將session池中的相對(duì)應(yīng)的對(duì)象刪除

2、Session.removeAttribute(…)

如:

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

用于刪除session對(duì)象中的屬性

通過(guò)重寫(xiě)URL來(lái)跟蹤會(huì)話:

前面已經(jīng)說(shuō)過(guò),Servlet容器先在客戶端保存一個(gè)SessionID,以后,在瀏覽器發(fā)出HTTP請(qǐng)求時(shí),都會(huì)包含這個(gè)SessionID.Servlet容器讀取HTTP請(qǐng)求中的這個(gè)SessionID,根據(jù)這個(gè)SessionID從容器中取出HttpSession對(duì)像,以便于跟蹤HTTP請(qǐng)求屬于哪一個(gè)會(huì)話,這一過(guò)程稱為會(huì)話的跟蹤。

如果瀏覽器支持Cookie,Servlet容器就將SessionID作為Cookie保存在瀏覽器的客戶端。但如果出于安全的考慮,用戶禁用了Cookie,那么Servlet容器又如何來(lái)跟蹤會(huì)話呢?

首先讓我們?cè)贗E中禁用Cookie(注意:對(duì)于某些GHOST的系統(tǒng)不起作用)。

IE>工具>Internet選項(xiàng)>隱私>高級(jí),然后禁用Cookie:

我們可以在主頁(yè)加上這樣的超鏈接:(與下面代碼中相關(guān)的SaveServlet.java GetServlet.java LogoutServlet.java的代碼我放在最后面貼)

<h2>演示重寫(xiě)url技術(shù)---破解用戶禁用cookie之后,我們session無(wú)效的問(wèn)題</h2> 
<form action="<%=response.encodeURL("saveServlet") %>" method="post"> 
name:<input type="text" name="name"/><br/> 
<input type="submit"/> 
</form> 
<a href="<%=response.encodeURL("getServlet") %>">重寫(xiě)url-讀取幾個(gè)容器中的數(shù)據(jù)</a><br/> 
<a href="<%=response.encodeURL("logoutServlet") %>">重寫(xiě)url-安全退出</a> 

這句<form action=“<%=response.encodeURL(“/aa”)%>”>就可以實(shí)現(xiàn)這一功能

在這里禁用了cookie以后,瀏覽器仍然能夠接收到服務(wù)器發(fā)送過(guò)來(lái)的cookie,但是瀏覽器只能接受不能發(fā)送出去給服務(wù)器,不能發(fā)送cookie的話也就不能夠去session池中去取相應(yīng)的對(duì)象了。

上面的代碼在表單里面輸入想要的值之后,再到下面的getServlet這里的超鏈接處訪問(wèn)看是不是仍然能夠顯示出輸入的值,答案是肯定的。這里的訪問(wèn)路徑就相當(dāng)于類似

http://localhost:8080/day07_2/CNCookieServlet;jsessionid=F8692D61CD46D094DBB7A8FC7387649C 的,后面帶的jsessionid=F8692D61CD46D094DBB7A8FC7387649C就是其id,如此,你到另一個(gè)瀏覽器中去輸入這個(gè)網(wǎng)址也能夠訪問(wèn)的到。
這里我要補(bǔ)充一下:(以下情況是在我將session池中HttpSession對(duì)象將對(duì)應(yīng)session的JSESSIONID值和value值寫(xiě)入cookie中,這個(gè)cookie會(huì)覆蓋系統(tǒng)造的那個(gè),就相當(dāng)于是我自己造的,我將存在時(shí)間設(shè)置成了十分鐘,如果不覆蓋的話,cookie在瀏覽器關(guān)閉時(shí)就會(huì)消亡,下面的現(xiàn)象也就不會(huì)出現(xiàn)了)

在是否禁用了cookie這兩種情況下在session池中新建的對(duì)象的id是不一樣的,即假如你在禁用了cookie時(shí)在表單中輸入了一個(gè)name的值,查詢結(jié)果如下:

并且jsessionid為2BB51EBDEAAF14D19656C71E1B6F9FF6

然后馬上換成不禁用cookie模式,輸入另一個(gè)名字如Tom,查詢結(jié)果自然會(huì)是兩個(gè)Tom,jsessionid為

203F9E4DB5D874476B81DAF350661B6A,與禁用是不一樣,這就使出現(xiàn)下面的結(jié)果了

然后此時(shí)我們將瀏覽器關(guān)閉,再次進(jìn)入瀏覽器,在不禁用cookie模式下查看訪問(wèn)結(jié)果,如下:

下面我將主要的代碼貼上來(lái):

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技術(shù)和session技術(shù)聯(lián)合起來(lái)做應(yīng)用的一個(gè)例子---※功能:讓用戶在關(guān)閉瀏覽器之后,如果10分鐘之內(nèi)能夠登錄本站,還能訪問(wèn)到session中的信息 
//向客戶端寫(xiě)一個(gè)key為"JSESSIONID"用value為sessionid的cookie, 
Cookie c=new Cookie("JSESSIONID", request.getSession().getId()); 
c.setMaxAge(60*10);//上面的現(xiàn)象就是這一句造成的,沒(méi)有這一句的話就不會(huì)有上面說(shuō)的現(xiàn)象了 
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對(duì)象無(wú)效就可以了 
request.getSession().invalidate(); 
out.println("已安全退出..."); 
} 
} 

以上所述是小編給大家介紹的JavaWeb Session 會(huì)話管理,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)歡迎給我留言,小編會(huì)及時(shí)回復(fù)大家的!

相關(guān)文章

  • 使用java反射將結(jié)果集封裝成為對(duì)象和對(duì)象集合操作

    使用java反射將結(jié)果集封裝成為對(duì)象和對(duì)象集合操作

    這篇文章主要介紹了使用java反射將結(jié)果集封裝成為對(duì)象和對(duì)象集合操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • java.lang.UnsupportedOperationException分析及解決辦法

    java.lang.UnsupportedOperationException分析及解決辦法

    日常開(kāi)發(fā)中我遇到j(luò)ava.lang.UnsupportedOperationException:異常兩次了,下面這篇文章主要給對(duì)大家介紹了關(guān)于java.lang.UnsupportedOperationException分析及解決辦法,需要的朋友可以參考下
    2024-03-03
  • 詳解SpringBoot配置連接池

    詳解SpringBoot配置連接池

    本篇文章主要詳解SpringBoot配置連接池,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • mybatis學(xué)習(xí)筆記之mybatis注解配置詳解

    mybatis學(xué)習(xí)筆記之mybatis注解配置詳解

    本篇文章主要介紹了mybatis學(xué)習(xí)筆記之mybatis注解配置詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • 【java 多線程】守護(hù)線程與非守護(hù)線程的詳解

    【java 多線程】守護(hù)線程與非守護(hù)線程的詳解

    這篇文章主要介紹了java守護(hù)線程與非守護(hù)線程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Java中和隊(duì)列相關(guān)的基本操作

    Java中和隊(duì)列相關(guān)的基本操作

    在Java中,隊(duì)列是一種常用的數(shù)據(jù)結(jié)構(gòu),用于存儲(chǔ)和管理元素。Java提供了Queue接口和其實(shí)現(xiàn)類,包括LinkedList和ArrayDeque等。隊(duì)列的基本操作包括入隊(duì)(enqueue)、出隊(duì)(dequeue)、獲取隊(duì)首元素(peek)和判斷隊(duì)列是否為空(isEmpty)。
    2023-09-09
  • Java 實(shí)現(xiàn)二叉搜索樹(shù)的查找、插入、刪除、遍歷

    Java 實(shí)現(xiàn)二叉搜索樹(shù)的查找、插入、刪除、遍歷

    本文主要介紹了Java實(shí)現(xiàn)二叉搜索樹(shù)的查找、插入、刪除、遍歷等內(nèi)容。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-02-02
  • JAVA通過(guò)HttpClient發(fā)送HTTP請(qǐng)求的方法示例

    JAVA通過(guò)HttpClient發(fā)送HTTP請(qǐng)求的方法示例

    本篇文章主要介紹了JAVA通過(guò)HttpClient發(fā)送HTTP請(qǐng)求的方法示例,詳細(xì)的介紹了HttpClient使用,具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-09-09
  • 淺談Java中的Queue家族

    淺談Java中的Queue家族

    Java中Collection集合有三大家族List,Set和Queue。當(dāng)然Map也算是一種集合類,但Map并不繼承Collection接口。List,Set在我們的工作中會(huì)經(jīng)常使用,通常用來(lái)存儲(chǔ)結(jié)果數(shù)據(jù),而Queue由于它的特殊性,通常用在生產(chǎn)者消費(fèi)者模式中。今天這篇文章將帶大家進(jìn)入Queue家族。
    2021-06-06
  • SpringBoot中對(duì)SpringMVC的自動(dòng)配置詳解

    SpringBoot中對(duì)SpringMVC的自動(dòng)配置詳解

    這篇文章主要介紹了SpringBoot中的SpringMVC自動(dòng)配置詳解,Spring MVC自動(dòng)配置是Spring Boot提供的一種特性,它可以自動(dòng)配置Spring MVC的相關(guān)組件,簡(jiǎn)化了開(kāi)發(fā)人員的配置工作,需要的朋友可以參考下
    2023-10-10

最新評(píng)論