• Session笔记


    一、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不变的情况

     

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

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


  • 相关阅读:
    谈谈泛型和锁,一个值得注意的问题!
    关于++运算符重载的一个问题,有点“饶”!
    关于抽象类的构造函数!
    在嵌套类中是否可以触发外部类中定义的事件!
    谈谈C#的私有成员的一个有趣的现象!
    关于循环引用!
    谈谈常数字段!
    C#中对byte类型的处理。
    C#l编译器是否会为值类型生成默认的构造函数!
    谈谈DivideByZeroException异常!并非像表面那么简单!
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5351510.html
Copyright © 2020-2023  润新知