一、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. Unable to execute dex: Multiple dex files define异常的解决办法

    问题: [2016-01-06 16:47:58 - Dex Loader] Unable to execute dex: Multiple dex files define Landroid/sup ...

  2. Redis文档

    http://manual.csser.com/redis/connection/auth.html

  3. poj 2503 Babelfish (查找 map)

    题目:http://poj.org/problem?id=2503 不知道为什么 poj  的 数据好像不是100000,跟周赛的不一样 2000MS的代码: #include <iostrea ...

  4. Eclipse环境下JBoss调试,解决引用的工程不被部署的问题

    其实算是一个很小的经验,在eclipse环境下进行jboss的部署,因为要定义某公共包的问题,将代码down下来做了个工程,部署时发现jboss提示:class not found! 从jboss部署 ...

  5. 设计模式 - observer

    简单来讲,就是observer依赖于subject,当subject发生变化时,observer得到通知,并将状态与subject同步,常来用于维护对象间状态的一致性. observer的工作过程大体 ...

  6. UVa 247 (传递闭包) Calling Circles

    题意: 有n个人m通电话,如果有两个人相互打电话(直接或间接)则在同一个电话圈里.输出所有电话圈的人的名单. 分析: 根据打电话的关系,可以建一个有向图,然后用Warshall算法求传递闭包. 最后输 ...

  7. apache开源项目--HIVE

    Hive是一个基于Hadoop的数据仓库平台.通过hive,我们可以方便地进行ETL的工作.hive定义了一个类似于SQL的查询语言:HQL,能 够将用户编写的QL转化为相应的Mapreduce程序基 ...

  8. a标签中的label在IE下触发不了a标签的href链接(label标签——解析)

    <a href="http://www.baidu.com/" target="_blank"> <span>百度</span&g ...

  9. cdn是什么和作用有些

    内容分发网络其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快.更稳定.通过在网络各处放置节点服务器所构 成的在现有的互联网基础之上的一层智能虚拟网络,CDN系 ...

  10. 转载:C++ 虚函数表解析

    目录(?)[+]   转载:http://blog.csdn.net/haoel/article/details/1948051# 前言 C++中 的虚函数的作用主要是实现了多态的机制.关于多态,简而 ...