一、Session机制

session机制採用的是在server端保持 HTTP 状态信息的方案 。

server使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。

当程序须要为某个client的请求创建一个session时,server首先检查这个client的请求里是否包括了一个session标识(即sessionId),假设已经包括一个sessionId则说明曾经已经为此客户创建过session,server就依照session id把这个session检索出来使用(假设检索不到,可能会新建一个。这样的情况可能出如今服务端已经删除了该用户相应的session对象,但用户人为地在请求的URL后面附加上一个JSESSION的參数)。假设客户请求不包括sessionId,则为此客户创建一个session而且生成一个与此session相关联的sessionId。这个session
id将在本次响应中返回给client保存。

二、保存SessionID的方式

①.保存session id的方式能够採用cookie,这样在交互过程中浏览器能够自己主动的依照规则把这个标识发送给server。

②.因为cookie可以被人为的禁用。必须有其他的机制以便在cookie被禁用时仍然可以把session id传递回server,常常採用的一种技术叫做URL重写,就是把session id附加在URL路径的后面,附加的方式也有两种,一种是作为URL路径的附加信息,还有一种是作为查询字符串附加在URL后面。网络在整个交互过程中始终保持状态,就必须在每一个client可能请求的路径后面都包括这个session id。

Session  Cookie

session通过SessionID来区分不同的客户, session是以cookie或URL重写为基础的,默认使用cookie来实现,系统会创造一个名为JSESSIONID的输出cookie。这称之为session cookie,以差别persistent cookies(也就是我们通常所说的cookie),session cookie是存储于浏览器内存中的,并非写到硬盘上的,通常看不到JSESSIONID,可是当把浏览器的cookie禁止后,webserver会採用URL重写的方式传递Sessionid。这时地址栏看到

session cookie针对某一次会话而言,会话结束session cookie也就随着消失了,而persistent cookie仅仅是存在于client硬盘上的一段文本。

关闭浏览器,仅仅会是浏览器端内存里的session cookie消失,但不会使保存在server端的session对象消失,相同也不会使已经保存到硬盘上的持久化cookie消失。

三、Session的生命周期

1)什么时候创建HTTPSession对象?

①:对于JSP:浏览器訪问訪问server端的不论什么一个JSP,server都会马上创建一个HttpSession对象?

不一定.

*若当前的JSP 是client訪问的当前WEB 应用的第一个资源,且 JSP 的 page 指定的session属性为false。则server就不会为JSP创建一个HttpSession对象

*若当前JSP不是client訪问的当前WEB应用的第一个资源,且其它页面已经创建一个HttspSession对象。则server也不会为当前JSP页面创建一个HttpSession对象,而会把和当前会话相关的那个HTTPSession对象返回给当前的JSP页面

②:对于Servlet::若 Servlet 是client訪问的第一个WEB应用的资源,则仅仅有调用了request.getSession() 或 request.getSession(true) 才会创建HTTPSession对象

2)page 指令 的session="false" 究竟什么意思

*当前JSP页面禁用session隐含变量。但能够使用其它的显示的 HttpSession对象

3)在Servlet 中 怎样获取HTTPSession对象?

*request.getSession(boolean create):当create 为 false 时,若没有和当前JSP页面关联的 Httpsession 对象,返回null,若有则返回 HttpSession 对象。

当create为 true ,一定会返回 HttPSession 对象,若没有和当前JSP页面关联的HTTPSession对象,则server会创建一个新的HTTPSession对象,若有关联。则直接返回关联的。

*request..getSession()等同于request.getSession(true)

4)什么时候销毁HttpSession对象

①.直接调用 HttpSession 的 invalidate() 方法:立马是HTTPSession对象失效

②.server卸载了当前 WEB 应用

③.超出了 HTTPSession 的过期时间

* 设置HttpSession的过期时间,调用session.setMaxInactiveInterval(int x); 单位是秒

* 在Tomcat 的 WEB.xml中设置 (单位是分钟。假设session不设置生命周期,就会使用这个默认的)

<session-config>

        <session-timeout>30</session-timeout >

    </session-config>

④. 并非关闭了浏览器就销毁了 session ,所以说要訪问到Session对象,能够通过持久化Cookie 和 URL重写 两种方式 。

具体看 HttpSession API

代码演示样例

login.jsp

<span style="font-family:KaiTi_GB2312;font-size:18px;"><%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body> SessionID: <%=session.getId() %><br><br>
IsNew: <%=session.isNew() %><br><br>
MaxInactiveInternal: <%=session.getMaxInactiveInterval() %><br><br>
createTime: <%=session.getCreationTime() %><br><br>
lastAccessTime: <%=session.getLastAccessedTime() %><br><br>
<%
Object username = session.getAttribute("username");
if(username == null){
username = "";
}
%>
<form action="hello.jsp" method="post"> <%--<form action="<%=response.encodeURL("hello.jsp") %>" method="post">--%> // 假设client的Cookie处于禁用状态,就要使用URL重写
username:<input type="text" name="username" value="<%=username %>" />
<input type="submit" name="Submit" />
</form>
</body>
</html></span>

hello.jsp

<span style="font-family:KaiTi_GB2312;font-size:18px;"><%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body> SessionID: <%=session.getId() %><br><br>
IsNew: <%=session.isNew() %><br><br>
MaxInactiveInternal: <%=session.getMaxInactiveInterval() %><br><br>
createTime: <%=session.getCreationTime() %><br><br>
lastAccessTime: <%=session.getLastAccessedTime() %><br><br>
Hello:<%=request.getParameter("username") %><br>
<%-- <a href="login.jsp?username= <%= request.getParameter("username") %> ">又一次登录</a> 採用设置属性的方式比較好--%>
<%
session.setAttribute("username",request.getParameter("username"));
%>
<%-- <%=response.encodeURL("login.jsp") %> <%=response.encodeURL("logout.jsp") %> URL重写--%>
<a href="login.jsp">又一次登录</a>
    
<a href="logout.jsp">注销</a>
</body>
</html></span>

logout.jsp

<span style="font-family:KaiTi_GB2312;font-size:18px;"><%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body> SessionID: <%=session.getId() %><br><br>
IsNew: <%=session.isNew() %><br><br>
MaxInactiveInternal: <%=session.getMaxInactiveInterval() %><br><br>
createTime: <%=session.getCreationTime() %><br><br>
lastAccessTime: <%=session.getLastAccessedTime() %><br><br>
Bye:<%=session.getAttribute("username") %><br><br> <a href="login.jsp? ">又一次登录</a>
<%
session.invalidate();//杀死session
%>
</body>
</html></span>

HttpSession接口中的方法

getId方法  getCreationTime方法

getLastAccessedTime方法 setMaxInactiveInterval方法

getMaxInactiveInterval方法 isNew方法

假设client请求消息中返回了一个与Servlet程序当前获得的HttpSession对象的会话标识号同样的会话标识号,则觉得这个HttpSession对象不是新建的。

invalidate方法 getServletContext方法

setAttribute方法 getAttribute方法

removeAttribute方法 getAttributeNames方法

HttpServletRequest接口中的Session方法

getSession方法 

public HttpSession getSession(boolean create)

public HttpSession getSession()

isRequestedSessionIdValid方法 

isRequestedSessionIdFromCookie方法 

isRequestedSessionIdFromURL方法



利用URL重写实现Session跟踪

Servlet规范中引入了一种补充的会话管理机制,它同意不支持Cookie的浏览器也能够与WEBserver保持连续的会话。这样的补充机制要求在响应消息的实体内容中必须包括下一次请求的超链接,并将会话标识号作为超链接的URL地址的一个特殊參数。

将会话标识号以參数形式附加在超链接的URL地址后面的技术称为URL重写。

假设在浏览器不支持Cookie或者关闭了Cookie功能的情况下,WEBserver还要可以与浏览器实现有状态的会话。就必须对全部可能被client訪问的请求路径(包含超链接、form表单的action属性设置和重定向的URL)进行URL重写。

HttpServletResponse接口中定义了两个用于完毕URL重写方法:

encodeURL方法 

encodeRedirectURL方法

关于在IE下禁用cookie,刷新SessionId不变的情况

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2p3MDEzMA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

从网上找到了答案,仅仅要是IE或基于IE内核的浏览器,关闭Cookie实际上并没有真的关闭,论坛上都是喷IE的

在Chrome 和 火狐 上试验。SessionID不刷新的问题就不存在了

Session笔记的更多相关文章

  1. WWDC15 Session笔记 - Xcode 7 UI 测试初窥

    https://onevcat.com/2015/09/ui-testing/ WWDC15 Session笔记 - Xcode 7 UI 测试初窥 Unit Test 在 iOS 开发中已经有足够多 ...

  2. [ios-必看] WWDC 2013 Session笔记 - iOS7中的多任务【转】

    感谢:http://onevcat.com/2013/08/ios7-background-multitask/ http://www.objc.io/issue-5/multitasking.htm ...

  3. WWDC 2013 Session笔记 - iOS7中的多任务

    这是我的WWDC2013系列笔记中的一篇,完整的笔记列表请参看这篇总览.本文仅作为个人记录使用,也欢迎在许可协议范围内转载或使用,但是还烦请保留原文链接,谢谢您的理解合作.如果您觉得本站对您能有帮助, ...

  4. WWDC 2014 Session笔记 - iOS界面开发的大一统

    本文是我的 WWDC 2014 笔记 中的一篇,涉及的 Session 有 What's New in Cocoa Touch Building Adaptive Apps with UIKit Wh ...

  5. WWDC 2013 Session笔记 - UIKit Dynamics入门

    本文涉及到的WWDC2013 Session有 1.Session 206 Getting Started with UIKit Dynamics 2.Session 221 Advanced Tec ...

  6. 【Python】Flask系列-cookie和session笔记

    cookie: 1.cookie出现的原因:在网站中,http请求是无状态的.也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户.cookie的出现就是为了 ...

  7. cookie和session笔记

    1.http协议是无连接的,即每一次http请求都是新的,和上一次没有联系,这不利于和用户的交互.针对这一缺点产生了cookie. 2.cookie是一段保存在客户端上的验证信息,同一个域使用同一个c ...

  8. Cookie&Session笔记

    # 今日内容     1. 会话技术         1. Cookie         2. Session     2. JSP:入门学习 ## 会话技术     1. 会话:一次会话中包含多次请 ...

  9. WWDC2016 Session笔记 - Xcode 8 Auto Layout新特性

    目录 1.Incrementally Adopting Auto Layout 2.Design and Runtime Constraints 3.NSGridView 4.Layout Feedb ...

随机推荐

  1. 中国海洋大学第四届朗讯杯高级组 A 2718 Rocky(模拟)

    题目:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2718 题意:优先直走,右 左 后.... ...

  2. 在Google被封的那些日子裏,我們這樣科學上網

    回到正題,如果某天你喜歡的網站被封了,你工作的郵箱無法訪問了,該如何用正確姿勢實現科學上網呢?雷鋒網為大家整理了數個小技巧. 1.FreeGate類傻瓜工具 很多人第一次用翻墻,應該是從FreeGat ...

  3. 架构版本与 NuGet 的版本不兼容 解决方案

    VS的NuGet管理在大大提高了开发效率,一直都在使用但今天在遇到了一个问题,引用一个所需要的NuGet包VS缺提示如下错误

  4. Azure 中的多个 VM NIC 和网络虚拟设备

    YU-SHUN WANG Azure 网络高级项目经理 在 2014 年欧洲 TechEd 大会上,我们宣布了在Azure VM 中为多个网络接口 (NIC) 提供支持,并与多家重要厂商合作,在 Az ...

  5. 【转】Android异步消息处理机制完全解析,带你从源码的角度彻底理解

    原文网址:http://blog.csdn.net/guolin_blog/article/details/9991569 转载请注明出处:http://blog.csdn.net/guolin_bl ...

  6. UVA 11928 The Busy Dog

    题意:一只狗被拴在杆子上,从起点开始按直线依次跑到给出的点最后回到起点问绕杆子几圈,逆时针为正,顺时针为负,撞到杆子输出Ouch!. 解法:用叉积判断方向,用余弦定理求出以杆子为顶点的角,加和除以2π ...

  7. UPC OJ 一道水题 STL

    Problem C: 字符串游戏 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 10  Solved: 3 [Submit][Status][Web ...

  8. 50道经典的JAVA编程题 (11-15)

    50道经典的JAVA编程题 (11-15),新年的第一天,继续啦...\(^o^)/~,这50道题都跨年了啊...哈哈 [程序11] TestTN.java 题目:有1.2.3.4个数字,能组成多少个 ...

  9. 《Genesis-3D开源游戏引擎完整实例教程-跑酷游戏篇04:如何实现触控操作》

    4.如何实现触控操作 触控操作概述: 随着APPLE.Samsung.SONY等众多公司,将掌机.电脑和手机等产品在触控领域的不断探索,以触控为操作的机型越来越多的被投放到市场当中.触控游戏.触控软件 ...

  10. HW6.9

    import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...