[Servlet&JSP] HttpSession会话管理

我们能够将会话期间必须共享的资料保存在HttpSession中,使之成为属性。假设用户关掉浏览器接受Cookie的功能。HttpSession也能够改用URL重写的方式继续其会话管理功能。

HttpSession的使用

在Servlet/JSP中。假设要进行会话管理,能够使用HttpServletRequest的getSession()方法取得HttpSession对象。语句例如以下:

HttpSession session = request.getSession();

getSession()方法有两个版本号,还有一个版本号能够传入布尔值,默觉得true。表示若尚未存在HttpSession实例。则直接建立一个新的对象。若传入为false,表示若尚未存在HttpSession实例。则直接返回null。

HttpSession上最经常使用的方法时setAttribute()与getAttribute(),能够在对象中设置和取得属性。默认在关闭浏览器前。所取得的HttpSession都是形同的实例。假设想要在此次会话期间直接让眼下的HttpSession失效。则能够运行HttpSession的invalidate()方法。一个使用的时机就是实现注销机制。一个示比例如以下:

Login.java:

@WebServlet("/login.do")
public class Login extends HttpServlet{
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        if ("abc".equals(username) && "123".equals(password)) {
            request.getSession().setAttribute("login", username);
            request.getRequestDispatcher("user.jsp")
                .forward(request, response);
        } else {
            response.sendRedirect("login.html");
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        processRequest(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        processRequest(request, response);
    }
}

在登录时,假设username和password正确,就会取得HttpSession并设置一个login属性,用以代表用户完毕登录的动作。

对于其它的Servlet/JSP。假设能够从HttpSession取得login属性,基本就能够确定是个已登录的用户,这类用来识别用户是否登录的属性。通常称为登录字符(Login Token)。在上例中,登录成功后会转发到用户界面。

User.jsp:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
    <c:choose>
        <c:when test="${sessionScope.login == null}">
            <jsp:include page="login.html" />
        </c:when>
        <c:otherwise>
            <h1>Welcome! ${sessionScope.login}!</h1>
            <a href="logout.do">Sign out</a>
        </c:otherwise>
    </c:choose>
</body>
</html>

Login.html

<body>
    <form action="login.do" method="post">
        username:<input type="text" name="username" /><br />
        password:<input type="password" name="password" /><br />
        <input type="submit" value="Sign in" />
    </form>
</body>

Logout.java:

@WebServlet("/logout.do")
public class Logout extends HttpServlet{
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        request.getSession().invalidate();
        response.sendRedirect("login.html");
    }
}

指定HttpSession的invalidate()之后,容器就会销毁并回收HttpSession对象。假设再次运行HttpServletRequest的getSession()。则说的取得的HttpSession就是另外一个新的对象了。

HttpSession会话管理原理

当运行HttpServletRequest的getSession()时,web容器会建立HttpSession对象。每一个HttpSession都会有一个特殊的ID。称之为Session ID。能够运行HttpSession的getID()能够取得Session ID。

这个Session ID默认会使用Cookie将其存放至浏览器。

在Tomcat中,Cookie的名称是JSESSIONID,数字则是getID()所取得的Session ID。

每一个HttpSession都有个特殊的Session ID,当浏览器请求应用程序时,会将Cookie中存放的Session ID一并发送给应用程序,web容器依据Session ID来取出相应的HttpSession对象,如此就能够取得各个浏览器的会话数据。

所以使用HttpSession来进行会话管理时,设置为属性的数据是保存在server端的,而Session ID默认使用Cookie存放于浏览器中。web容器储存Session ID的Cookie被设置为关闭则浏览器就会失效,又一次打开浏览器请求应用程序时,通过getSession()所取得的是新的HttpSession对象。

因为HttpSession会占用内存空间,所以HttpSession得属性中尽量不要保存耗资源的大型对象,必要时可将属性移除,或者不需使用HttpSession时。运行invalidate()让HttpSession失效。

关闭浏览器时会立即失效的是浏览器上的Cookie,而不是HttpSession。

能够运行HttpSession的setMaxInactiveInterval()方法,设置浏览器在多久没有请求应用程序的情况下,HttpSession就会自己主动失效,设置的单位是”秒”。也能够在web.xml中设置HttpSession默认的失效时间,但要注意的时,这里设置的时间单位是”分钟”。比如:

<web-app ...>
    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>
</web-app>

保存Session ID的Cookie被设置为关闭浏览器就失效。

关闭浏览器后若希望保存信息,必须通过自行操作Cookie来达成。比如完毕自己主动登录机制。

HttpSession与URL重写

假设在用户禁用Cookie的情况下,仍打算运用HttpSession来进行会话管理。那么能够搭配URL重写的方式。向浏览器响应一段超链接。超链接URL后附加Session ID。当用户点击超链接时。则将Session ID以GET请求方式发送给web应用程序。

假设要使用URL重写的方式来发送Session ID。则能够使用HttpServletRequest的encodeURL()协助产生所需的URL重写。

当容器尝试取得HttpSession实例时,若能够从HTTP请求中取得带有Session ID的Cookie,encodeURL()会将设置给它的URL原封不动的输出;若无法从HTTP请求中取得带有Session ID的Cookie(一般是浏览器禁用Cookie的情况),encodeURL()会自己主动产生带有Session ID的URL重写。

假设有运行encdeURL(),在浏览器第一次请求站点时,容器并不知道浏览器是否禁用Cookie,所以容器的做法是Cookie(发送set-cookie标头)与URL重写都做,因此若Servlet有下面语句,不管浏览器是否禁用Cookie,第一次请求时。都会显示编上Session ID的URL。

request.getSession();
out.println(response.encodeURL("index.jsp"));

当再次请求时,假设浏览器没有禁用Cookie,则容器能够从Cookie(从cookie标头)中取得Session ID。此时encodeURL()就仅仅会输出index.jsp。假设浏览器禁用Cookie,则encodeURL()就会继续在URL上编上Session ID

HttpServletResponse的还有一个方法encodeRedirectURL()方法。能够在要去浏览器重定向时,在URL上编上Session ID。

时间: 2024-10-23 19:12:29

[Servlet&amp;JSP] HttpSession会话管理的相关文章

jsp/servlet学习三之会话管理初解

由于http的无状态性,使得会话管理或会话跟踪成为web应用开发一个无可避免的主题.默认下,一个web服务器无法区分一个http请求是否为第一次访问.例如,一个web邮件应用要求用户登陆后才能查看邮件,因此,当用户输入了相应的用户名和密码后,应该不应该再次提示需要用户登陆,应该必须记住那些用户已经登陆.换句话说,应该必须能管理用户的会话. URL重写 URL重写是一种会话跟踪技术,它将一个或者多个token添加到URL的查询字符串中,每个token通常为key=value形式,如下: url?k

session management会话管理的原理

web请求与响应基于http,而http是无状态协议.所以我们为了跨越多个请求保留用户的状态,需要利用某种工具帮助我们记录与识别每一次请求及请求的其他信息.举个栗子,我们在淘宝购物的时候,首先添加了一本<C++ primer>进入购物车,然后我们又继续去搜索<thinking in java>,继续添加购物车,这时购物车应该有两本书.但如果我们不采取session management会话管理的话,基于http无状态协议,我们在第二次向购物车发出添加请求时,他是无法知道我们第一次添

会话管理

一.会话管理的基本原理 web应用程序的请求与响应是基于HTTP,为无状态的通信协议,服务器不会记得这次请求和下次请求的关系,如购物车,用户可能在多个购物网页之间采购商品,web应用程序必须有个方式来得知用户在这些网页中采购了哪些商品,这种记得此次请求与之后请求间关系的方式,就称为会话管理(Session Management). 1.使用隐藏域 隐藏域就是主动告知服务器多次请求间必要信息的方式之一.以问卷作答的为例,上一页的问卷答案,可以用隐藏域的方式放在下一页的窗体中,这样发送下一页窗体,就

使用Spring Session做分布式会话管理

在Web项目开发中,会话管理是一个很重要的部分,用于存储与用户相关的数据.通常是由符合session规范的容器来负责存储管理,也就是一旦容器关闭,重启会导致会话失效.因此打造一个高可用性的系统,必须将session管理从容器中独立出来.而这实现方案有很多种,下面简单介绍下: 第一种是使用容器扩展来实现,大家比较容易接受的是通过容器插件来实现,比如基于Tomcat的tomcat-redis-session-manager,基于Jetty的jetty-session-redis等等.好处是对项目来说

10、会话管理/编程实战分析/Jsp

1 会话管理回顾 会话管理 1)会话管理: 管理浏览器和服务器之间的会话过程中产生的会话数据 2)Cookie技术: 会话数据保存在浏览器客户端. Cookie核心的API: 2.1 在服务器端创建Cookie对象 Cookeie cookie = new Cookie("name","value"); 2.2 把cookie发送给浏览器端(通过响应头:set-cookie) response.addCookie(cookie); 2.3 浏览器带着cookie信息

WEB程序会话管理--HttpSession和Cookie

WEB应用的会话管理的原理: 由于WEB应用的请求和响应是基于HTTP的,而HTTP由属于无状态的通信协议,只能记录本次请求的信息,因此服务器不会记住这一次的请求和下一次请求的关系.所以会话管理的原理:在下一次请求之前,主动将要维持的信息告知给服务器,使得WEB应用程序可以得知请求之间的关联. 主要的实现方式: 1.隐藏域的使用: 2.Cookie的使用: 3.URL的重写 其中1和3比较简单,也是大家最常用的,目的很简单,就是告诉服务器他应该记住的东西,免得他老人家忘了啊. 现在主要说一下Co

Servlet,jsp,JSP技术 ,JSP编程

 一.Servlet 思考 1 浏览器可以直接打开JAVA/class文件吗? 不可以 2浏览器可以打开HTML.JS 文件吗? 可以 3 JAVA程序可以生成HTML文件吗?可以的,用IO流. 4 浏览器解析的时候是需要HTTP协议的,JAVA普通类有没有HTTP协议呢? 普通类没有. JAVA-(class)浏览器如何访问呢? 浏览器---HTML A   JAVA通过IO流生成HTML--->浏览器 B   JAVA 需要加入HTTP协议 解决上面2个问题可以通过 Servlet C  如

Java中的会话管理——HttpServlet,Cookies,URL Rewriting(译)

参考谷歌翻译,关键字直接使用英文,原文地址:http://www.journaldev.com/1907/java-session-management-servlet-httpsession-url-rewriting Java Web应用程序中的会话管理(Session Management)是一个非常有趣的话题.Java Servlet中的会话通过不同的方式进行管理,例如Cookie,HttpSession API,URL重写等. 这是Java Web应用程序系列教程中的第三篇文章,您可能

第十章 会话管理——《跟我学Shiro》

Shiro提供了完整的企业级会话管理功能,不依赖于底层容器(如web容器tomcat),不管JavaSE还是JavaEE环境都可以使用,提供了会话管理.会话事件监听.会话存储/持久化.容器无关的集群.失效/过期支持.对Web的透明支持.SSO单点登录的支持等特性.即直接使用Shiro的会话管理可以直接替换如Web容器的会话管理. 会话 所谓会话,即用户访问应用时保持的连接关系,在多次交互中应用能够识别出当前访问的用户是谁,且可以在多次交互中保存一些数据.如访问一些网站时登录成功后,网站可以记住用