会话技术 Session

一、概念

1. Session: 将会话中产生的数据保存在服务端 ; 是服务端技术 ;

2. 具体流程

1)浏览器第一次发送请求需要保存数据时,服务端获取到需要保存的数据, 去服务器内部检查一下有没有为当前浏览器服务的session ; 如果有就直接拿过来用, 如果没有session就创建一个新的session拿过来用 ;

2)当浏览器再去访问服务器时, 服务器可以从session中获取到之前为当前浏览器保存的数据, 通过这种方式, 也可以来保存会话中产生的数据,服务器做出响应:将session 的id通过Cookie发送给浏览器; 如下:

具体如下图: 客户端再次请求服务器时,会把session的id带给服务器 ,服务端根据session的id到服务器中取出该session

3. Session域对象

作用访问:整个会话范围

setAttribute();

getAttribute();

removeAttribute();

getAttributeNames();

4. 生命周期

1)创建: 当第一次调用request.getSession(),创建session对象

request.getSession();

request.getSession(true);

在调用上述方法时, 如果服务器内部有为当前客户端服务的session, 就直接拿过来使用,

 如果没有对应的session, 就创建一个新的session拿过来用.

 

request.getSession(false); 在调用该方法时, 如果服务器内部有为当前浏览器服务的session就直接拿过来使用,;如果没有对应的session, 就返回null.

2)销毁

a. 超时销毁

   如果session 30分钟没有被使用,(例如登陆后,30分钟未操作,会通知重新登陆) 则会超时销毁. 可以在web应用的web.xml文件中修改session的超时时间.

 <!-- 配置session的超时时间(默认30分钟这里设1分钟 -->  

 <session-config>

     <session-timeout>1</session-timeout>

  </session-config>

b. 自杀

当调用session.invalidate方法时,将会立即销毁session

Request.getSession().invalidate();

c. 意外身亡(session的钝化)

当服务器非正常关闭时, session会销毁! 如果服务器正常关闭session将会以文件的形式保存在服务器的work目录下;

session的活化:  当服务器再次启动时,钝化着的session还可以再恢复回来

5. 具体案例

1) 将商品加入购物车

	protected void doGet(HttpServletRequest request,HttpServletResponse response)
			throws ServletException,IOException {
		// 处理响应正文乱码
		response.setContentType("text/html;charset=utf-8");
		// 1.获取请求中包含的商品信息(prod)
		String prod = request.getParameter("prod");
		prod = new String(prod.getBytes("iso8859-1"),"utf-8");

		// 2.获取一个Session对象
		HttpSession session = request.getSession();
		// 创建一个Cookie
		// 名字:JSESSIONID, 值:session.getId();
		Cookie cookie = new Cookie("JSESSIONID", session.getId());
		// 设置Cookie的path为: /day16/
		cookie.setPath(request.getContextPath()+ "/");
		// 设置Cookie的MaxAge: 30分钟
		cookie.setMaxAge(1800);
		// 将Cookie添加到response中发送给浏览器
		response.addCookie(cookie);

		// 3.将商品信息加入购物车(保存进session中)
		session.setAttribute("prod", prod);
		// 4.做出响应
		response.getWriter().write("成功将[ "+ prod + " ]商品加入了购物车!");
	}

2)为购物车中的商品进行结算

	protected void doGet(HttpServletRequest request,HttpServletResponse response)
			throws ServletException,IOException {
		// 处理响应正文乱码
		response.setContentType("text/html;charset=utf-8");

		// 1.获取(之前的)Session对象
		HttpSession session = request.getSession();
		
		
		// 2.从session中取出要结算的商品
		String prod = (String) session.getAttribute("prod");
		
		// 3.为商品进行结算
		response.getWriter().write("成功为[ "+ prod + " ]商品支付了10000元!");
	}

6.优化  服务器返回cookie携带session的id 的方案:

在创建session后, 服务器会向浏览器发送Cookie来保存session的id, 我们也可以向浏览器发送Cookie,

也保存session的id, 区别是我们发送的Cookie, 可以设置最大生存时间

猜你喜欢

转载自blog.csdn.net/qq_24271537/article/details/81176777
今日推荐