Servlet Session管理

原创 2013年12月08日 21:24:45

一.用Cookie进行Session管理

Cookie是一段键/值文本信息,可以存放在浏览器的内存中或者是硬盘上,Cookie不仅仅用于发送给浏览器,服务器上的JSP/Servlet之间也可以传递Cookie。

下面的例子是服务器上Cookie的使用

login.jsp:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!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>
   <form action="LoginServlet" method="post">
       <input type="text" name="name" />
       <input type="submit" value="Login">
   </form>
</body>
</html>

LoginServlet.java:

@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

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

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String name = request.getParameter("name");
		Cookie cookie = new Cookie("name",name);
		//设置过期时间,以秒为单位
		cookie.setMaxAge(3000);
		response.addCookie(cookie);
		response.sendRedirect("success.jsp");
	}
}
success.jsp:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!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>
<%
	String name = "";
	Cookie[] cookies = request.getCookies();
	if (cookies != null) {
		for(Cookie cookie : cookies){
			if (cookie.getName().equals("name")) {
				name = cookie.getValue();
			}
		}		
	}
%>
<h3>Hi <%=name %>, Login successful.</h3>
</body>
</html>

LoginServlet中根据表单的内容创建一个cookie对象,然后再跳转到success.jsp,success.jsp中遍历所有的cookie,获得LoginServlet传入的cookie对象。Cookie的存活期限取决于setMaxAge传入的参数,负数则浏览器关闭后删除cookie,只在浏览器内存中保存。0则是删除这个cookie。

在浏览器中输入longin.jsp地址,输入内容后点击按钮,跳到success.jsp。这时复制success.jsp的连接,关闭浏览器,再次打开,直接进入success.jsp以后,发现上次输入的用户名显示在页面上。

login.jsp输入:


success.jsp输出:

这时改动一下LoginServlet的代码,setMaxAge(3000)改为setMaxAge(-1)。再次重复上面的步骤,结果是

Hi , Login successful.

即cookie在浏览器关闭后被删除了。

二.用HttpSession 进行Session管理

当用户第一次访问一个网站时servlet容器自动创建HttpSession对象,通过getSession方法可以获得当前用户的HttpSession。

Servlet容器为它创建的每一个HttpSession生成一个唯一的标识符,并且将它返回浏览器,这个标识符一般是一个名为JSESSIONID的Cookie,浏览器保存这个cookie,就是持久型cookie,在用户下一次访问网站时,服务器端根据浏览器发送的这个Cookie找到对应的HttpSession对象,取出里面保存的对象,以完成会话管理,这种技术可以用于自动登录等用途。HttpSession中的值是保存在服务器内存中的,所以要避免将太大的对象放在里面。

下面的例子是服务器上的HttpSession和客户端的Cookie配合进行会话管理。稍微改动一下上面的程序:

LoginServlet.java:

@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

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

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String name = request.getParameter("name");
		HttpSession session = request.getSession();
		session.setAttribute("name", name);
		System.out.println("session.getId():" + session.getId());
		response.sendRedirect("success.jsp");
	}
}
success.jsp:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!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>
<%
	String name = "";
	name = request.getSession().getAttribute("name") ==
			null?"":request.getSession().getAttribute("name").toString();
	Cookie[] cookies = request.getCookies();
	if (cookies != null) {
		for(Cookie cookie : cookies){
			System.out.println(cookie.getName() + " : " + cookie.getValue());
		}		
	}
%>
<h3>Hi <%=name %>, Login successful.</h3>
</body>
</html>
页面输出和上面一样,注意后台打印的值:

session.getId():BA956325800E90C5F7A6FBCA71B53733
JSESSIONID : BA956325800E90C5F7A6FBCA71B53733

session.getId的值和Cookie中的JSESSIONID是一样的。会话跟踪时就是根据这个值来匹配HttpSession对象的。



版权声明:本文为博主原创文章,未经博主允许不得转载。

[Servlet&JSP] HttpSession会话管理

我们可以将会话期间必须共享的资料保存在HttpSession中,使之成为属性。如果用户关掉浏览器接受Cookie的功能,HttpSession也可以改用URL重写的方式继续其会话管理功能。HttpSe...
  • u011331383
  • u011331383
  • 2015年12月14日 19:50
  • 2387

Servlet中不可不知的Session技术

目录目录 介绍 Session和Cookie的主要区别 Session的创建 Session的销毁 Session的实现原理 解决浏览器关闭后就立即丢失Session ID的问题 浏览器禁用Cooki...
  • qq_15096707
  • qq_15096707
  • 2017年05月02日 15:59
  • 1075

[Servlet]使用HttpSession进行会话管理

1. Session模型:     1) HTTP协议是无状态的,无法记录多次请求/响应之间的联系,而Session模型就好比一个中间人,可以帮助使用HTTP协议通信的双方记录每次通信的内容(即会话...
  • Lirx_Tech
  • Lirx_Tech
  • 2015年11月04日 22:15
  • 2267

会话管理之session技术

上一节我们总结了cookie技术,这节主要总结一下session技术。 1. session对象         在web开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意...
  • eson_15
  • eson_15
  • 2016年04月27日 15:55
  • 4432

WEB状态管理机制剖析(cookie、session)

一、状态管理     (1)状态管理的含义         将浏览器与web服务器之间多次交互当做一个整体来看待,并且将多次交互所涉及的数据(即状态)保存下来。     (2)如何进行状态管理    ...
  • daijin888888
  • daijin888888
  • 2016年04月12日 17:20
  • 620

ServletFilter中管理Hibernate Session

web.xml  filter>         filter-name>HelloHibernateFilterfilter-name>         filter-class>com.xanad...
  • daryl715
  • daryl715
  • 2007年11月21日 19:28
  • 1640

Servlet中对象session的使用

Session基于Cookie技术,Session保存在服务器端(一般会设置有效期),SessionID保存在客户端.Session里面保存!!若干个!!!"键-值"对,可以通过 void setAt...
  • zavens
  • zavens
  • 2007年08月26日 20:59
  • 31022

通过Spring Session实现Session集中管理

随着企业级JAVA应用的发展,目前这个领域已经出现了很大的革新,现代的发展趋势是微服务以及可水平扩展的原生云应用(Cloud native application)。在这样的发展趋势下,过去所使用的S...
  • bigdabao1
  • bigdabao1
  • 2017年05月15日 10:27
  • 406

【Servlet】在servlet中使用session

众所周知,在JSP页面上可直接通过session.setAttribute(name,object)设置session。 可如果想在servlet使用session 的话,就和在JSP有点区别了。 在...
  • oYunTaoLianWu
  • oYunTaoLianWu
  • 2013年08月30日 02:36
  • 13540

Servlet——Session(1)之基础知识

本文介绍了Servlet会话技术中的Session技术,介绍了什么是Session、Session的用途;介绍了在Servlet中使用Session的方法;并介绍了Session的生命周期...
  • ggGavin
  • ggGavin
  • 2016年05月09日 19:05
  • 7388
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Servlet Session管理
举报原因:
原因补充:

(最多只允许输入30个字)