日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java中session对象登录_JavaWeb中Session对象的学习笔记

發布時間:2023/12/9 java 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的形式發送給客戶端瀏覽器,如下圖所示:

點擊刷新按鈕,再次請求服務器,此時就可以看到瀏覽器再請求服務器時,會把存儲到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);

四、瀏覽器禁用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下的運行效果如下:

演示效果

通過查看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的火狐瀏覽器下訪問,效果如下:

從演示動畫中可以看到,瀏覽器第一次訪問時,服務器創建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有所幫助。

總結

以上是生活随笔為你收集整理的java中session对象登录_JavaWeb中Session对象的学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。