Session是什么?
session機制是一種服務器端的機制,
用來在無狀態的HTTP協議下越過多個請求頁面來維持狀態和識別用戶。
當程序需要為某個客戶端的請求創建一個session的時候,
服務器首先檢查這個客戶端的請求里是否已包含了一個session標識。
這個標識稱為session id,
如果已包含一個session id則說明以前已經為此客戶端創建過session,
服務器就按照session id把這個session檢索出來使用,
若沒有創建過,則創建一個新的Session。
Session是什么時候創建的呢?
之前一直錯誤地理解為:
當用戶向服務器發起請求時,這個session便會立刻建立起來,
但實際上卻根本不是這樣。
在Servlet中,你肯定用過下面這句話,
HttpSession session = request.getSession();
如果當前沒有session,則會立刻建立一個session;
如果有session則返回當前session。
這句話和
HttpSession session = request.getSession(true);
的效果是一樣的。
但是如果你寫成
HttpSession session = request.getSession(false);
則不會自動建立session。
若當前沒有session,你所得到的seesion只會是一個null。
我們先來測試訪問一個jsp頁面
在servlet中我們寫上
HttpSession session = request.getSession(false);
System.out.println(session==null);
這句話不會建立session,如果當前沒有seesion建立的話,控制台輸出應該是true的。
然后我們去訪問頁面。
第一次訪問:輸出true(servlet先於jsp被執行),表示第一次訪問時session為null
第二次訪問:輸出false,session已存在,不為null
這表示session的確已經被建立了,所以會有JSESSIONID。
這是怎么回事呢?
原因:
默認的情況下,用戶第一次訪問jsp頁面就會創建session,
因為jsp中指令session默認配置為true,
即
<%@ page session="true"%>
下面我簡單解釋下jsp的運行過程,
jsp運行時,先會轉換成一個java文件然后再編譯成class文件,最后輸出結果。
既然這樣,我們就可以先查看下jsp生成的java文件
打開
%TOMCAT_HOME%\work\Catalina\localhost\
然后打開所使用項目名稱的文件夾,比如我的是:
Test01\org\apache\jsp
這個jsp文件夾下面就是你對應的jsp生成的java文件代碼了,
這個目錄結構和你的WebRoot的jsp目錄結構是一樣的。
打開/test/test_jsp.java
里面有一句
session = pageContext.getSession();
因此當這個jsp頁面執行時,這句話就會幫你創建session了。
總結:
session不是一打開網站就會立刻建立。
它的建立需要基於下面兩個條件中的任意一個:
1:在servlet中手動調用
HttpSession session = request.getSession();
或者
HttpSession session = request.getSession(true);
2:jsp中沒有寫<%@ page session="false"%>
(默認情況下它是<%@ page session="true"%>的)
如果兩個條件同時都不滿足,那么你建立的只是一個無seesion的連接。
Session創建的實例
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ page session="false" %> <%--注意這一句,很重要--%> <html> <head> <title>IDEA搭建SpringMVC並用maven配置的小例子</title> </head> <%--<link rel="stylesheet" href="/asset/css/style.css"/>--%> <%--<script type="text/javascript" src="/plugs/js/jquery-1.7.2.js"></script>--%> <body> <form id="userForm" action="/user/find" method="post"> 用戶名:<input type="text" name="username"><br> 密碼:<input type="password" name="password"> <button type="button">登錄</button> <%--<button type="button" onclick="login()">登錄</button>--%> </form> </body> <%--<script> function login() { $.ajax({ type: 'post', url: $('#userForm').attr('action'), data: $('#userForm').serialize(), dataType: 'json', success: function (data) { if (data.result = "success") { // alert("登錄成功");//阻塞的,點擊彈出框后,才能到“登錄成功”的界面 location.href = '/user/success'; } else { alert("用戶名或者密碼錯誤!"); } } }); } </script>--%> </html>
package com.springmvc.controller; /** * IDEA搭建SpringMVC並用maven配置的小例子 */ import com.springmvc.entity.User; import com.springmvc.service.UserService; import org.apache.log4j.Logger; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.util.HashMap; import java.util.List; import java.util.Map; @Controller @RequestMapping("/user") public class ViewController { private Logger logger = Logger.getLogger(ViewController.class); @Resource(name = "UserService") private UserService userService; @RequestMapping("/index") public String index(HttpServletRequest request, HttpServletResponse response) { logger.info("進入 index 方法"); HttpSession httpSession = request.getSession(); return "index"; }
1,第1次訪問
1,第2次訪問
2,第1次訪問
2,第2次訪問
總結:
session不是一打開網站就會立刻建立。
它的建立需要基於下面兩個條件中的任意一個:
1:在servlet中手動調用
HttpSession session = request.getSession();
或者
HttpSession session = request.getSession(true);
2:jsp中沒有寫<%@ page session="false"%>
(默認情況下它是<%@ page session="true"%>的)
如果兩個條件同時都不滿足,那么你建立的只是一個無seesion的連接。