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的連接。









