java中session對象登錄_JavaWeb中Session對象的學習筆記

一、Session簡單介紹

在WEB開發中,服務器可以為每個用戶瀏覽器創建一個會話對象(session對象),注意:一個瀏覽器獨占一個session對象(默認情況下)。因此,在需要保存用戶數據時,服務器程序可以把用戶數據寫到用戶瀏覽器獨占的session中,當用戶使用瀏覽器訪問其它程序時,其它程序可以從用戶的session中取出該用戶的數據,為用戶服務。

二、Session和Cookie的主要區別

Cookie是把用戶的數據寫給用戶的瀏覽器。

Session技術把用戶的數據寫到用戶獨占的session中。

Session對象由服務器創建,開發人員可以調用request對象的getSession方法得到session對象。

三、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的形式發送給客戶端瀏覽器,如下圖所示:

b58f67b163daf09271aabe0b5039772c.png

點擊刷新按鈕,再次請求服務器,此時就可以看到瀏覽器再請求服務器時,會把存儲到cookie中的session的Id一起傳遞到服務器端了,如下圖所示:

4bb3fb17292244ae48033f1bbc91f050.png

我猜想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);

四、瀏覽器禁用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("本網站有如下書:
");

Set> set = DB.getAll().entrySet();

for(Map.Entry 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() + " 購買
");

}

}

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

doGet(request, response);

}

}

/**

* @author gacl

* 模擬數據庫

*/

class DB{

private static Map map = new LinkedHashMap();

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 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 list = (List) session.getAttribute("list"); //得到用戶用于保存所有書的容器

if(list==null){

list = new ArrayList();

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 list = (List) session.getAttribute("list");

if(list==null || list.size()==0){

out.write("對不起,您還沒有購買任何商品!!");

return;

}

//顯示用戶買過的商品

out.write("您買過如下商品:
");

for(Book book : list){

out.write(book.getName() + "
");

}

}

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

doGet(request, response);

}

}

在禁用了cookie的IE8下的運行效果如下:

4a230c5fda7c5641005af4cb5294ea36.gif

演示效果

通過查看IndexServlet生成的html代碼可以看到,每一個超鏈接后面都帶上了session的Id,如下所示

//本網站有如下書:


javaweb開發

購買

//spring開發

購買

// hibernate開發

購買

//struts開發

購買

//ajax開發

購買

所以,當瀏覽器禁用了cookie后,就可以用URL重寫這種解決方案解決Session數據共享問題。而且response. encodeRedirectURL(java.lang.String url) 和response. encodeURL(java.lang.String url)是兩個非常智能的方法,當檢測到瀏覽器沒有禁用cookie時,那么就不進行URL重寫了。我們在沒有禁用cookie的火狐瀏覽器下訪問,效果如下:

7e765187fb59abe28db6a44a3ad7dccc.gif

從演示動畫中可以看到,瀏覽器第一次訪問時,服務器創建Session,然后將Session的Id以Cookie的形式發送回給瀏覽器,response. encodeURL(java.lang.String url)方法也將URL進行了重寫,當點擊刷新按鈕第二次訪問,由于火狐瀏覽器沒有禁用cookie,所以第二次訪問時帶上了cookie,此時服務器就可以知道當前的客戶端瀏覽器并沒有禁用cookie,那么就通知response. encodeURL(java.lang.String url)方法不用將URL進行重寫了。

五、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的失效時間,例如:

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">

index.jsp

15

當需要在程序中手動設置Session失效時,可以手工調用session.invalidate方法,摧毀session。

1 HttpSession session = request.getSession();

2 //手工調用session.invalidate方法,摧毀session

3 session.invalidate();

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/395753.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/395753.shtml
英文地址,請注明出處:http://en.pswp.cn/news/395753.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vux flexbox使用_Flexbox用大的,彩色的動畫gif進行解釋

vux flexbox使用Here are three links worth your time:這是三個值得您花費時間的鏈接: How Flexbox works — explained with big, colorful, animated gifs (5 minute read) Flexbox的工作原理-帶有大尺寸,彩色動畫gif動畫( 閱讀5分鐘 ) How to commi…

微信小程序 沒有找到 node_modules 目錄

在學習小程序云開發的時候,遇到一個問題,使用npm i --production 和npm i vant-weapp -S --production之后,在微信開發者工具中并沒有node_modules文件夾 但是在根目錄下生成了一個package-lock.json文件。也就是下載的依賴都已經裝好了&…

關于Unity中UI中的Image節點以及它的Image組件

一、圖片的Inspector面板屬性 Texture Type:一般是選擇sprite(2D and UI) Sprite Mode:一般是選擇Single Packing Tag:打包的標志值,最后打包的時候會把Tag相同的所有小圖打包成一個大圖。不像cocos打包圖集需要用到第三方軟件&am…

Knockoutjs官網翻譯系列(一)

最近馬上要開始一個新項目的研發,作為第一次mvvm應用的嘗試,我決定使用knockoutjs框架。作為學習的開始就從官網的Document翻譯開始吧,這樣會增加印象并加入自己的思考,說是翻譯也并不是純粹的翻譯,會加入自己對知識點的思考以及自…

無人機導航定位系統Java_無人機高精度室內定位導航的技術方案

原標題:無人機高精度室內定位導航的技術方案因為一些特殊的用途,比如室內表演,編隊室內飛行等,無人機不可避免會在室內飛行,無人機對室內定位精度的要求很高,室內空間本身就不會太大,若定位精度…

javascript控制臺_如何充分利用JavaScript控制臺

javascript控制臺by Darryl Pargeter達里爾帕格特(Darryl Pargeter) 如何充分利用JavaScript控制臺 (How to get the most out of the JavaScript console) One of the most basic debugging tools in JavaScript is console.log(). The console comes with several other use…

Django之靜態文件配置

靜態文件 了解靜態文件配置之前,我們需要知道靜態文件是什么? 靜態文件其實指的是像css,js,img等一些被模板需要的文件。 如何在Django中配置我們的靜態文件 1.建立static文件夾,將靜態文件放在該目錄下 2.在settings文件下配置如…

神奇的圖像處理算法

http://blog.chinaunix.net/uid-23065002-id-4392043.html http://blog.csdn.net/k_shmily/article/details/51138154 幾周前,我介紹了相似圖片搜索。 這是利用數學算法,進行高難度圖像處理的一個例子。事實上,圖像處理的數學算法&#xff0c…

JavaWeb項目前端規范(采用命名空間使js深度解耦合)

沒有規矩不成方圓,一個優秀的代碼架構不僅易于開發和維護,而且是一門管理與執行的藝術。 這幾年來經歷了很多項目,對代碼之間的強耦合及書寫不規范,維護性差等問題深惡痛絕。在這里,通過仔細分析后,結合自己…

java重要基礎知識點_java基礎知識點整理

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓java基礎知識點整理1.&和&&的區別?&:邏輯與(and),運算符兩邊的表達式均為true時,整個結果才為true。&&:短路與,如果第一個表達式為false時&#…

網易云音樂的算法有什么特點_當算法設計音樂廳時會發生什么?

網易云音樂的算法有什么特點Here are three links worth your time:這是三個值得您花費時間的鏈接: What happens when algorithms design a concert hall? (3 minute read) 當算法設計音樂廳時會發生什么? ( 閱讀3分鐘 ) How to land a top-notch tec…

開機發現超級管理員賬戶不見了

今天出現了一個怪現象,連接打印機的電腦上沒有超級管理員賬戶,只有一個剛建立的新賬戶,這是怎們回事來?噯,原來啊,安裝Windows XP時,如果又設置了一個管理員賬戶,那么系統內置沒有密…

vs自帶iis局域網調試

http://www.cnblogs.com/liluping860122/p/4685564.html轉載于:https://www.cnblogs.com/wcLT/p/5594252.html

java.util.set cannot be assigned from null_Java中有關Null的9件事

對于Java程序員來說,null是令人頭痛的東西。時常會受到空指針異常(NPE)的騷擾。連Java的發明者都承認這是他的一項巨大失誤。Java為什么要保留null呢?null出現有一段時間了,并且我認為Java發明者知道null與它解決的問題相比帶來了更多的麻煩&…

node.js事件驅動_了解Node.js事件驅動架構

node.js事件驅動by Samer Buna通過Samer Buna 了解Node.js事件驅動架構 (Understanding Node.js Event-Driven Architecture) Update: This article is now part of my book “Node.js Beyond The Basics”.更新:這篇文章現在是我的書《超越基礎的Node.js》的一部分…

如何基于 Notadd 構建 API (Laravel 寫 API)

如何基于 Notadd 構建 API Notadd 底層實現了 passport 機制,有統一的授權管理,主要支持兩種方式進行 API 授權,一個是 client,領一個是 passport,這個在其他文檔中有做詳細的說明。 這里主要說的是,如何基…

mysql 基于集_一種基于記錄集查找特定行的方法_MySQL

問:我的一個表中包含了名為IdValue的單列主鍵。對于給定的IdValue值,我希望找到緊鄰目標值之前和之后的表行(假定結果按IdValue排序)。怎樣才能不使用游標而通過一個基于集合的方法得到需要的結果?答:Transact-SQL是一個基于集合的…

react 交互_如何在React中建立動畫微交互

react 交互Microinteractions guide a user through your application. They reinforce your user experience and provide delight.微交互引導用戶完成您的應用程序。 它們可以增強您的用戶體驗并帶來愉悅感。 You may have seen some of the slick examples of microinterac…

HTTPS與MITM

HTTPS:基于SSL/TSL的HTTP協議 MITM:Man-In-The-Middle中間人攻擊 Https下中間人攻擊的思路: 1 去https化 2 向CA申請相似域名的證書 防范: 睜大雙眼轉載于:https://www.cnblogs.com/the-owl/p/5596254.html

PCB genesis自制孔點 Font字體實現方法

一.先看genesis原有Font字體 在PCB工程CAM加孔點字體要求時,通常我們直接用Geneis軟件給我們提供了2種孔點字體canned_57與canned_67,但此字體可能不能滿足各個工廠個性化需求,比如:孔密度,孔間距,孔形狀分布,如果有一…