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
- encodeURL(String url); 用于对超链接和Form表单的action属性中设置的URL重写
- 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));