JavaWeb(会话及其会话技术)

第五章、会话及其会话技术

5.1 会话概述

会话类似于生活中的打电话过程,指的是一个客户端(浏览器)与Web服务器之间连续发生的一系列请求和响应过程。

    Request 每次HTTP请求,Web服务器都会创建一个HttpServletRequest对象,该对象只能保存本次请求所传递的数据。 ServletContext 同一个Web应用共享的是一个ServletContext对象,用户发送结账请求无法区分哪个商品是哪个用户所购买的

5.2 Cookie对象

Cookie是一种会话技术,将会话过程中的数据保存到用户的浏览器中,使浏览器和服务器更好地进行数据交互。

服务器向客户端发送Cookie时,会在Http响应头字段中增加Set-Cookie响应头字段

Set-Cookie: user=itcast; Path=/;

user表示Cookie名称,itcast表示Cookie的值,Path表示Cookie属性。Cookie必须以键值对的形式存在,属性可以有多个,属性之间用分号和空格分隔。

用户第一次访问服务器,服务器在响应消息中增加Set-Cookie头字段,将用户信息以Cookie形式发送给浏览器,浏览器接收并缓存。再次访问的时候,请求的消息中以Cookie形式发送给服务器,服务器可分辨用户信息。

API

获取设置属性名称、有效时间(-1默认永久保存)、有效目录路径(所有有效/)、有效域、采用的协议版本、注解、是否使用安全协议等。

5.3 Session对象

Cookie传递的信息多的时候显然会增大服务器端程序处理的难度,可以使用Session技术。Session将会话数据保存到服务器端的技术。

概述

访问网站时,创建一个Session对象,会话信息会存放在此对象中,同时Session的ID以Cookie(Set-Cookie:JSESSIONID=111)形式返回给甲的浏览器。根据Cookie找到Session,根据Session找到用户信息。

API

Session与每个请求消息紧密相关,HttpServletRequest定义获取Session对象的

getSession(boolean create)方法(重载后的,一个可创建新的一个返回NULL) Session可能是新创建的,发送Cookie字段,要在发送任何响应前。

获取对象id,创建时间,上一次请求关联时间,修改当前会话的默认超时间隔,无效,是否是新创建,当前对象的ServletContext对象,设置获取删除属性对象。

超时管理

HttpSession对象超时变垃圾对象,等待回收。超时再次请求会创建新的Session,分配新ID属性。

<session-config>
<session-timeout>30</session-timeout>//单位是分钟   0或负数 永不超时
</session-config>

Cookie禁用或不支持

HttpServletRequest内置API

  1. encodeURL(String url); 用于对超链接和Form表单的action属性中设置的URL重写
  2. encodeRedirectURL(String url); 重定向的URL修改

如果用户支持Cookie时,后续访问使用cookie头字段,服务器判断出支持,就不重写URL啦。通常情况下,是要开启Cookie功能的。

Session 存储一次性验证码

//1.获取session,设置响应体数据类型,获取输出流
HttpSession session = request.getSession();
response.setContentType("image/jpeg");
ServletOutputStream sos = response.getOutputStream();


//2.设置浏览器不要缓存此图片
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires",0);

//3.创建内存图像并获取上下文
BufferedImage image = 
new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();//获取画笔
//产生随机验证码
char[] rands=generateCheckCode();
//产生图像
drawBackground(g);
drawRands(g,rands);
//结束绘制
g.dispose();

//4.输出图像到客户端
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ImageIO.write(image,"jpeg",bos);
byte[] buf = bos.toByteArray();
response.setContentLength(buf.length);
bos.writeTo(sos);

//5.验证码存入session
session.setAttribute("check_code",new String(rands));
经验分享 程序员 微信小程序 职场和发展