一、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. 基于Android Studio搭建Android应用开发环境

    备注:电脑是windows xp系统 1.     安装JDK和环境变量设置 JDK是java development kit,Java JDK下载地址 http://www.oracle.com/t ...

  2. Android开发之读写联系人

    读写联系人需要用到android的ContentProvider 同时需要读和写联系人的权限 需要使用到联系人数据库中的 * raw_contacts表: * contact_id:联系人id * d ...

  3. Android开发之在子线程中使用Toast

    在子线程中使用Toast的时候,出现Force close. 错误提示:Can't create handler inside thread that has not called Looper.pr ...

  4. get mac 20150202

    getmac.sh #!/bin/sh cat oui.txt|sed -e :a -e '$!N;s/\n\s/=/;ta' -e 'P;D' | sed 's/(hex)\+/=/g' | sed ...

  5. hdu4638Group

    http://acm.hdu.edu.cn/showproblem.php?pid=4638 求某一区间所包含的连续的段 对于乱序的数 到了i这个数所包含的段数 首先把这个数看作单独的段 再看一下前面 ...

  6. 第三部分 MediaPlayer的主要实现分析

    第三部分 MediaPlayer的主要实现分析 3.1 JAVA程序部分    在packages/apps/Music/src/com/android/music/目录的MediaPlaybackS ...

  7. 函数buf_LRU_get_free_only

    /******************************************************************//** Returns a free block from th ...

  8. 百度地图API的调用

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head ...

  9. C#第三方控件的使用

    一.DEVEXPRESS的使用 官网:https://www.devexpress.com/ 入门教程:http://wenku.baidu.com/link?url=2sXEEby1ffx9JTWG ...

  10. 消息系统Kafka介绍

    1.  概述 Kafka是Linkedin于2010年12月份开源的消息系统,它主要用于处理活跃的流式数 据.活跃的流式数据在web网站应用中非常常见,这 些数据包括网站的pv.用户访问了什么内容,搜 ...