会话技术 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--实现用户浏览商品列表,可以将商品加入购物车,并可以对购物车的商品进行结算

具体流程:

将商品加入购物车:实现BuyServlet:  从参数列表中获取选中的商品信息---获取session对象---将商品信息保存到session中---创建cookie对象---将之前的session的Id存入cookie中 --- 将cookie返回给客户端

为购物车中的商品进行结算:实现PayServlet  :  获取session对象 -- 从session对象中获取需要支付的商品---执行支付

注意:创建session的方法----request.getSession(); //获取浏览器中对应的session,通过之前保存在cookie中的JSESSIONID

1) 将商品加入购物车:实现BuyServlet

	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)为购物车中的商品进行结算:实现PayServlet

	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, 可以设置最大生存时间

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值