[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。
[Servlet&JSP] HttpSession会话管理的更多相关文章
- jsp/servlet学习三之会话管理初解
由于http的无状态性,使得会话管理或会话跟踪成为web应用开发一个无可避免的主题.默认下,一个web服务器无法区分一个http请求是否为第一次访问.例如,一个web邮件应用要求用户登陆后才能查看邮件 ...
- java web Servlet 学习笔记 -3 会话管理技术
Cookie和HttpSession 什么是会话: 用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. 每个用户在使用浏览器与服务器进行会话的过 ...
- HeadFirst Jsp 06 (会话管理)
现在我们希望能够跨多个请求保留客户特定的状态. 现在, 模型中的业务只是检查请求中的参数, 并返回一个响应(建议), 应用中没有谁记得在当前请求之前与这个客户之间发生过什么. 与一个客户的整个会话期间 ...
- 我的Java之旅 第七课 JAVA WEB 会话管理
1.隐藏域 隐藏域其实不是Servlet/JSP的会话管理机制的内容,但它能实现简单的页面状态记录的效果. 2.Cookie Cookie类 setMaxAge() 设置有效期 ...
- 使用Spring Session做分布式会话管理
在Web项目开发中,会话管理是一个很重要的部分,用于存储与用户相关的数据.通常是由符合session规范的容器来负责存储管理,也就是一旦容器关闭,重启会导致会话失效.因此打造一个高可用性的系统,必须将 ...
- Servlet会话管理三(HttpSession)
Session是服务器端技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的HttpSession对象.由于Session为浏览器用户所独享,所以用户在访问服务器的web资源时,可以把各自的数 ...
- 【JSP&Servlet学习笔记】4.会话管理
Http本身是无状态通信协议,要进行会话管理的基本原理,就是将需要维护的状态回应给浏览器,由浏览器在下次请求时主动发送状态信息,让Web应用程序“得知”请求之间的关联. 隐藏字段是将状态信息以窗体中看 ...
- 10、会话管理/编程实战分析/Jsp
1 会话管理回顾 会话管理 1)会话管理: 管理浏览器和服务器之间的会话过程中产生的会话数据 2)Cookie技术: 会话数据保存在浏览器客户端. Cookie核心的API: 2.1 在服务器端创建C ...
- WEB程序会话管理--HttpSession和Cookie
WEB应用的会话管理的原理: 由于WEB应用的请求和响应是基于HTTP的,而HTTP由属于无状态的通信协议,只能记录本次请求的信息,因此服务器不会记住这一次的请求和下一次请求的关系.所以会话管理的原理 ...
随机推荐
- thinkPHP的Excel插件
原文地址 http://www.thinkphp.cn/topic/14005.html 总结的注意事项 1实例化第三方类,要在类名前加\ ,不然引用地址不对. 实现步骤:一:在http://phpe ...
- java类的方法
我前面说的都是类的属性,现在说类的方法: 类{ 属性:“类有什么” 方法:“类能做什么” } 首先我们在之前创建的学生类中添加个打印1-10数字的方法,参数是name package cuteSnow ...
- spring security中当前用户信息
1:如果在jsp页面中获取可以使用spring security的标签库 在页面中引入标签 1 <%@ taglib prefix="sec" uri="htt ...
- javascript-知识点集合
第三课.JavaScript的语法与关键字 1.JavaScript的语法 字符串.数字.布尔.数组.对象.Null.Undefined 1.js的变量区分大小写 username userName ...
- POJ 1286
Burnside定理. 可以用Euler函数优化. #include <iostream> #include <cstdio> #include <cstring> ...
- poj 3311 Hie with the Pie (TSP问题)
Hie with the Pie Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4491 Accepted: 2376 ...
- Button的Click事件与js函数的两种不同顺序触发方式
先运行js.或者先运行Click事件,近期就遇到了这个问题,開始弄了两个button分别运行,那才叫一个蛋疼... 1.先运行js,再运行Button的Click函数 <asp:Button I ...
- CoreData 从入门到精通(六)模型版本和数据迁移
前面几篇文章中讲的所有内容,都是在同一个模型版本上进行操作的.但在真实开发中,基本上不会一直停留在一个版本上,因为需求是不断变化的,说不定什么时候就需要往模型里添加新的字段,添加新的模型,甚至是大规模 ...
- java中的输入输出<1>
java中的输入输出基础(1) java中的IO支持通过java.io包下的类和接口来支持.在java.io包下主要包括输入.输出两种io流,每种输入.输出流又分为字节流和字符流. 字节流就是以字节为 ...
- httputil用http获取请求的工具类
package com.xiaocan.demo.util; import java.io.IOException; import java.io.InputStream; import java.u ...