本文主要是介绍JavaWeb之05_cookiesession,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
会话技术
明天又是充满希望的一天…
一、简介
1. 概念
- 会话:一次会话中包含多次请求和响应
- 一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止
- 会话功能:在一次会话的范围内的多次请求间,共享数据
- 方式
- 客户端会话技术:Cookie
- 服务器端会话技术:Session
二、Cookie
1. 概念
- 客户端会话技术,将数据保存到客户端
2. 入门
- 1)使用步骤
- 创建Cookie对象,绑定数据
new Cookie(String name, String value)
- 发送Cookie对象
response.addCookie(Cookie cookie)
- 获取Cookie,拿到数据
Cookie[] request.getCookies()
- 创建Cookie对象,绑定数据
3. 原理
- 基于响应头
set-cookie
和请求头cookie
实现
4. 详解
① 一次可以发送多个cookie吗?
- 可以
- 可以创建多个Cookie对象,使用response调用多次addCookie()即可
② cookie在浏览器保存多长时间?
- 1)默认:在浏览器关闭后,cookie数据被销毁
- 2)持久化存储
setMaxAge(int seconds)
- 正数:将cookie数据写到硬盘文件中。持久化存储。seconds:cookie存活时间
- 负数:默认值
- 零:删除cookie信息
③ cookie能不能存中文或特殊字符
- tomcat8之前不能直接存储中文数据。
- 需要将中文数据转码。一般采用URL编码
- tomcat8之后,支持中文数据
- tomcat不支持特殊字符,需要使用URL解码和编码
④ cookie共享问题
- 1)假设在同一个tomcat服务器中,部署了多个web项目,那么在这些web项目中cookie能不能共享?
- 默认,不能
- 如何使之能共享?
setPath(String path)
:设置cookie的获取范围。默认,设置当前虚拟目录setPath("/")
:可以使当前服务器根目录下的所有项目都可以共享
- 2)不同tomcat服务器之间如何共享?
setDomain(String path)
:如果设置一级域名相同,那么多个服务器之间cookie可以共享
5. 特点和作用
① 特点
- 1)cookie存储数据在客户端浏览器(不安全)
- 2)浏览器对于单个cookie的大小有限制(4kb),以及对同一个域名下的总cookie数量(20个)也有限制
② 作用
- cookie一般用于存储少量的不太敏感的数据
- 在不登录的情况下,完成服务器对客户端的身份识别
6. 案例
① 记录上一次访问时间
-
1)需求
- 访问一个servlet,如果第一次访问,则提示:您好,欢迎您首次访问。如果不是第一次访问,则提示:欢迎回来,您上次访问时间为:xxx
-
2)分析
- 在服务器中的servlet判断是否有一个名为lastTime的cookie
- 有:不是第一次访问
- 响应数据
- 没有:是第一次访问
- 响应数据
- 写回cookie
- 有:不是第一次访问
- 在服务器中的servlet判断是否有一个名为lastTime的cookie
-
3)代码
-
//0.设置响应消息体的content-type response.setContentType("text/html;charset=utf-8");//1.获取所有cookie Cookie[] cookies = request.getCookies(); boolean flag = false; //没有cookie为false//2.遍历cookie if (cookies != null && cookies.length > 0) {for (Cookie cookie : cookies){//3.获取cookie的名称String name = cookie.getName();//4.查询是否存在lastTime的cookieif ("lastTime".equals(name)) {//有该cookie,不是第一次访问flag = true;//5.响应数据String value = cookie.getValue();//URL解码System.out.println("解码前:" + value);value = URLDecoder.decode(value, "utf-8");System.out.println("解码后:" + value);PrintWriter writer = response.getWriter();writer.write("<h1>" + "欢迎回来,您上次访问时间为:" + value + "</h1>");//6.设置cookie最新值,发送cookieSimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss");String dateNow = sdf.format(new Date());//因为tomcat不支持cookie特殊字符,所以需要URL编码解码System.out.println("编码前:" + dateNow);dateNow = URLEncoder.encode(dateNow, "utf-8");System.out.println("编码后:" + dateNow);cookie.setValue(dateNow);//设置cookie存活时间cookie.setMaxAge(60 * 60 * 12); //12hresponse.addCookie(cookie);break;}} } if (cookies == null || cookies.length == 0 || !flag) {//没有lastTime的cookie,第一次访问//获取当前时间SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss");String dateNow = sdf.format(new Date());dateNow = URLEncoder.encode(dateNow, "utf-8");//创建cookie对象Cookie cookie = new Cookie("lastTime", dateNow);//设置cookie存活时间cookie.setMaxAge(60 * 60 * 12); //12hresponse.addCookie(cookie);//响应数据PrintWriter writer = response.getWriter();writer.write("<h1>" + "您好,欢迎您首次访问." + "</h1>"); }
-
二、Session
1. 概念
- 服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中。HttpSession
2. 入门
- 1)获取HttpSession对象
HttpSession request.getSession();
- 2)使用HttpSession对象
Object getAttribute(String name)
void setAttribute(String name, Object obj)
void removeAttribute(Sting name)
3. 原理
- Session是依赖于Cookie的
- 1)请求时,在第一次获取Session时,没有cookie,会在内存中创建一个新的session对象
- 2)在响应时,服务器会设置响应头
set-session:JSESSION=session对象的地址
- 3)再次请求时,浏览器会带着
cookei:JESSION=session对象的地址
请求服务器,在服务器中获取session,根据该cookie获取session,是同一个session对象
4. 详解
① 当客户端关闭后,服务端不关闭,两次获取session是否是同一个?
-
1)默认情况不是
-
2)可以通过设置cookie的值来持久化存储session
-
HttpSession session = request.getSession(); Cookie cookie = new Cookie("JSESSION", session.getId()); cookie.setMaxAge(60 * 60);
-
② 客户端不关闭,服务器关闭后,两次获取session时同一个吗?
- 1)不是同一个
- 2)在服务器关闭后,如何确保数据不丢失?
- session的钝化:在服务器正常关闭之前,将session序列化到硬盘上
- session的活化:在服务器开启后,将session文件转化到内存中的session对象
- 注意:tomcat自动完成钝化和活化,idea的tamcat无法活化
③ session的失效时间?
-
1)服务器关闭时session被销毁
-
2)session调用invalidate()
-
3)session默认失效时间:30分钟
-
选择性配置修改,web.xml中
-
<session-config><session-timeout>30</session-timeout> </session-config>
-
5. 特点
① 特点
- 1)session是用于存储一次会话的多次请求的数据,存储在服务器端
- 2)session可以存储任意类型、任意大小数据
② session和cookie的区别
- 1)session数据存储在服务器端,cookie存储在客户端
- 2)session没有数据大小限制,cookie有
- 3)session数据安全,cookie相对不安全
6. 案例
① 验证码
-
1)需求
- 访问带有验证码的登录页面login.jsp
- 用户输入用户名,密码及验证码
- 如果用户名和密码输入有误,跳转登录页面,提示:用户名或密码错误
- 如果验证码输入有误,跳转登录页面,提示:验证码错误
- 如果全部输入正确,则跳转到主页seuccess.jps,显示:用户名,欢迎你
-
2)分析
-
3)代码
- 略
-
4)出现的小问题
-
① 错误信息如何初始什么都不显示
-
<div><%= request.getAttribute("cc_error") == null ? "" : request.getAttribute("cc_error") %></div> <div><%= request.getAttribute("login_error") == null ? "" :request.getAttribute("cc_error") %></div>
-
-
② 点后退后,验证码重复使用(如何保证验证码的一次性?)
-
在登录的servlet中,获取验证码后立即删除session的共享数据域
-
//先获取生产的验证码 HttpSession session = request.getSession(); String checkCode_session = (String)session.getAttribute("checkCode_session"); //处理点击浏览器的后退后,验证码不刷新问题 session.removeAttribute("checkCode_session");
-
-
-
域
- ```java//先获取生产的验证码HttpSession session = request.getSession();String checkCode_session = (String)session.getAttribute("checkCode_session");//处理点击浏览器的后退后,验证码不刷新问题session.removeAttribute("checkCode_session");```
这篇关于JavaWeb之05_cookiesession的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!