JavaWeb Session详解

代码地址以下:
http://www.demodashi.com/demo/12756.htmlhtml

记得把这几点描述好咯:代码实现过程 + 项目文件结构截图 + ## Session的由来git

上一篇博文介绍了Cookie的相关知识,其中介绍了必须采用一种机制来惟一标识一个用户,同时记录该用户的状态。
因而就引入了第一种机制:Cookie机制;那么第二种就是Session机制。

Session机制:采用的是在服务器端保持Http状态信息的方案。结合两篇博文也能够看出两种机制最明显的区别就是cookie是存储子在客户端,
而Session是存储在服务器端。具体二者的区别我会在下一篇博文详细介绍。web

Session的定义即基本介绍

Session,善始善终的一系列动做/消息的意思,其实咱们举一个小例子来讲:好比咱们一次打电话,从接起电话到你挂断电话的一系列过程能够称为一个Session。
Session在Web开发环境下的语义又有了新的扩展,它的含义是指一类用来在客户端与服务器端之间保持状态的解决方案。
有时候Session也用来指这种解决方案的存储结构。浏览器

Session存储方式

服务器使用一种相似于散列表的结构(也可能就是使用散列表)来保存信息。tomcat

Session标识传递的过程

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

下面是流程图:

服务器

Session的几种存储方式

  1. 使用Cookie: 保存session id的方式能够采用cookie,这样在交互过程当中浏览器能够自动的按照规则把这个标识发送给服务器,这种cookie称为session cookie。
    以下图:
    cookie

  2. URL重写: 因为cookie能够被人为的禁用,必须有其它的机制以便在cookie被禁用时仍然可以把session id传递回服务器,
    常常采用的一种技术叫作URL重写,就是把session id附加在URL路径的后面,附加的方式也有两种,一种是做为URL路径的附加信息,
    另外一种是做为查询字符串附加在URL后面。网络在整个交互过程当中始终保持状态,就必须在每一个客户端可能请求的路径后面都包含这个session id。
    以下图:

    网络

Session的建立与删除

  1. Session建立
    (1). 对于Jsp: 若当前页面为浏览器(客户端)访问web应用的第一个资源页面且Jsp的Page指定的Session属性的值为true。
    (2). 对于Servlet: 若当前Servlet为浏览器(客户端)访问web应用的第一个资源时,使用request.getSession()或request.getSession(true)建立。
  2. Session删除
    (1). 调用session.invalidate()方法
    (2). 卸载web应用程序
    (3). 超过了HttpSession的过时时间

Session的超时管理

WEB服务器没法判断当前的客户端浏览器是否还会继续访问,也没法检测客户端浏览器是否关闭,因此,即便客户已经离开或关闭了浏览器,
WEB服务器还要保留与之对应的HttpSession对象。

随着时间的推移而不断增长新的访问客户端,WEB服务器内存中将会所以积累起大量的再也不被使用的HttpSession对象,并将最终致使服务器内存耗尽。

WEB服务器采用“超时限制”的办法来判断客户端是否还在继续访问,若是某个客户端在必定的时间以内没有发出后续请求,WEB服务器则认为客户端已经中止了活动,
结束与该客户端的会话并将与之对应的HttpSession对象变成垃圾。

若是客户端浏览器超时后再次发出访问请求,WEB服务器则认为这是一个新的会话的开始,将为之建立新的HttpSession对象和分配新的会话标识号。

会话的超时间隔能够在web.xml(Tomcat服务器或者web应用程序)文件中设置,其默认值由Servlet容器定义。
session

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

具体实现

登陆页面代码实现app

SessionId: <%= session.getId() %>
    <br/><br/>
    
    isCreateNew:<%= session.isNew() %>
    <br/><br/>
    
    maxInActiveInterval:<%= session.getMaxInactiveInterval() %>
    <br/><br/>
    
    CreatedTime:<%= session.getCreationTime() %>
    <br/><br/>
    
    lastAccessedTime: <%= session.getLastAccessedTime() %>
    <br/><br/>
    
    <%
        Object username = session.getAttribute("username");
        if(username == null){
            username = "";
        }
    %>
    <form action="<%= response.encodeURL("loginSuccess.jsp") %>" method="post">
        username: <input type="text" name="username" value="<%= username%>"/><br/>
        <input type="submit" value="登陆"/>
    </form>

登陆成功页面代码实现

SessionId: <%= session.getId() %>
    <br/><br/>
    
    isCreateNew:<%= session.isNew() %>
    <br/><br/>
    
    maxInActiveInterval:<%= session.getMaxInactiveInterval() %>
    <br/><br/>
    
    CreatedTime:<%= session.getCreationTime() %>
    <br/><br/>
    
    lastAccessedTime: <%= session.getLastAccessedTime() %>
    <br/><br/>
    
    Hello: <%= request.getParameter("username") %>
    <br/><br/>
    
    <%
        //将username存储于session之中,便于在整个会话过程当中记住当前user;
        // 固然服务器端能够找到session仍是经过cookie(URL重写)在客户端和服务器端传递JSESSIONID
        session.setAttribute("username", request.getParameter("username"));
    %>
    

        <!-- 
        
            cookie被禁用的状况下使用url重写的方式传递JSSESSIONID;
            重写使用:response.encodeURL或response.encodeRedirectURL()都行
        -->
        

    <a href="<%= response.encodeURL("login.jsp") %>">从新登陆</a>
    <a href="<%= response.encodeURL("loginOut.jsp") %>">注销</a>

注销页面实现

SessionId: <%= session.getId() %>
    <br/><br/>
    
    isCreateNew:<%= session.isNew() %>
    <br/><br/>
    
    maxInActiveInterval:<%= session.getMaxInactiveInterval() %>
    <br/><br/>
    
    CreatedTime:<%= session.getCreationTime() %>
    <br/><br/>
    
    lastAccessedTime: <%= session.getLastAccessedTime() %>
    <br/><br/>
    
    ByeBye: <%= session.getAttribute("username") %>
    <br/><br/>
    
    <%
        //注销session
        session.invalidate();
    %>
    
    <a href="login.jsp">从新登陆</a>

How to run code

  1. 将代码clone到本地,使用eclipse导入代码,导入的时候项目的类型选择"git project"。
  2. 右键项目 run on Server。

法二: 将项目中WebContent中的内容拷入你的Tomccat服务器下的webapps目录下你建的站点名,
而后启动tomcat服务器,
在浏览器中输入: http://localhost:8080/站点名,便可访问

站点页面展现

login页面

loginSuccess页面

loginOut页面

项目文件结构截图

疑问联系

我的博客:http://blog.tommyyang.cn
我的邮箱:tingzai.yang@gmail.comJavaWeb Session详解

代码地址以下:
http://www.demodashi.com/demo/12756.html

注:本文著做权归做者,由demo大师代发,拒绝转载,转载须要做者受权

相关文章
相关标签/搜索