一、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. python 控制vbox虚拟机

    (本机环境:win7:python 2.7.9: vbox 4.3.12) 目标: 完成官网(https://pypi.python.org/pypi/pyvbox)上的demo: > pyth ...

  2. poj3270Cow Sorting(置换)

    链接 对于组合数学是一点也不了解 讲解 重要一点 要知道一个循环里最少的交换次数是m-1次 . #include <iostream> #include<cstdio> #in ...

  3. poj 1860 Currency Exchange (最短路bellman_ford思想找正权环 最长路)

    感觉最短路好神奇呀,刚开始我都 没想到用最短路 题目:http://poj.org/problem?id=1860 题意:有多种从a到b的汇率,在你汇钱的过程中还需要支付手续费,那么你所得的钱是 mo ...

  4. My97 DatePicker使用之自定义事件

    参考网站:http://www.my97.net/dp/demo/resource/2.5.asp 自定义事件 如果你需要做一些附加的操作,你也不必担心,日期控件自带的自定义事件可以满足你的需求.此外 ...

  5. bzoj1061 1283

    以前写的1061但一直没懂,后来懂了但忘写解题报告了 做了1283顺便补一下吧 1061 我是orz https://www.byvoid.com/blog/noi-2008-employee/#mo ...

  6. ORACLE参数文件

    一.oracle pfile/spfile区别    pfile 默认的名称为“init+例程名.ora”文件路径:E:\oracle\product\10.2.0\db_1\dbs,这是一个文本文件 ...

  7. git参考书籍

    Pro GIt 简体中文版 http://iissnan.com/progit/

  8. andori 动画验证必填项

    android项目开发过程中,都会碰到必填项的校验,最简单的就是利用Toast对用进行提示,感觉这种提示太不够人性化了,那么今天就来个带动画的,并可以将光标定位到必填项中. andorid动画Anim ...

  9. java vm args

    这个问题主要还是由这个问题 java.lang.OutOfMemoryError: Java heap space 引起的.第一次出现这样的的问题以后,引发了其他的问题.在网上一查可能是JAVA的堆栈 ...

  10. Ejabberd源码解析前奏--安全

    一.防火墙设置    当你配置防火墙的时候,你需要注意以下 TCP 端口: 端口 描述 5222 用于 Jabber/XMPP 客户端连接的标准端口, 纯文本或 STARTTLS. 5223 Jabb ...