Java EE会话技术Cookie和Session
会话技术
一、定义
会话技术是帮助服务器记住客户端状态的(区分客户端的)。将客户访问的信息存在本地的叫Cookie技术,存在服务器上的叫Session技术。
注意:
- 一次会话何时开始?从打开一个浏览器访问某个站点时开始
- 一次会话何时结束?到关闭这个浏览器的时候结束。而不是关掉某个站点时
Cookie和Session的区别
- Cookie:数据存储在客户端本地,减少服务器端的存储压力,但是安全性不好,客户端可以清除Cookie
- Session:将数据存储到服务器端,安全性相对较好,但是增加了服务器的压力
二、Cookie技术
学习分为两个方面
- 服务器端怎样将一个cookie发送到客户端
- 服务器端如何接收客户端携带的cookie
//1创建cookie对象,cookie不能存中文,只能存储非中文字符串
Cookie cookie = new Cookie("name", "zhangsan");
//2以头的形式将cookie中的信息发送到客户端
response.addCookie(cookie);
默认Cookie的级别是会话级别,即关掉浏览器,缓存的东西就被清除。那么如何让cookie持久化呢?
如果访问每一个网页都带着cookie,这会增加响应时间。因此我们应该为cookie指定访问哪些资源时需要携带的路径。
注意:如果不设置携带路径,那么该cookie信息会在访问产生该cookie的web资源所在的路径都携带该cookie信息。
// 1创建cookie对象,cookie不能存中文,只能存储非中文字符串
Cookie cookie = new Cookie("name", "zhangsan");
// 1.1为cookie对象设置持久化时间
cookie.setMaxAge(1 * 10);// 单位是秒
// 1.2指定需要携带cookie的路径
// 这句话的意思是只在访问/sendCookie时才携带此cookie
// 注意:如果不设置携带路径,那么该cookie信息会在访问产生该cookie的web资源所在的路径都携带该cookie信息。
cookie.setPath("/WEWB16/sendCookie");
// 2以头的形式将cookie中的信息发送到客户端
response.addCookie(cookie);
// 获取服务器向客户端写的cookie的数据
Cookie[] cookies = request.getCookies();
// 通过名字获得想要的cookie
if (cookies != null) {
for (Cookie cookie : cookies) {
// 获得cookie的name
String cookieName = cookie.getName();
if ("name".equals(cookieName)) {
// 获得该cookie的值
String cookieValue = cookie.getValue();
System.out.println(cookieValue);
}
}
}
记住用户上一次访问时间
- 用一个Servlet记住当前访问的时间
new Date()
,并把当前时间以cookie的形式写给客户端 - 获取客户端携带名字叫lastAccessTime的这个cookie,并获得时间,显示给用户
代码实现
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// response.setCharacterEncoding("UTF-8");
// 获得当前时间
Date date = new Date();
DateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String currentTime = format.format(date).replace(" ", "9999");
// 1创建一个cookie,记录当前的最新访问时间
Cookie cookie = new Cookie("lastAccessTime", currentTime);
cookie.setMaxAge(60 * 10 * 60);
response.addCookie(cookie);
// 2获得客户端携带的名字为lastAccessTime的cookie
Cookie[] cookies = request.getCookies();
String lastAccessTime = null;
if (cookies != null) {
for (Cookie coo : cookies) {
// 第一次这段代码是不执行的,因此lastAccessTime还是空串
if ("lastAccessTime".equals(coo.getName())) {
lastAccessTime = coo.getValue().replace("9999", " ");
}
}
} // if
response.setContentType("text/html;charset=UTF-8");
if (lastAccessTime == null) {
response.getWriter().write("你是第一次访问");
} else {
response.getWriter().write("你上次访问的时间是:" + lastAccessTime);
}
}
tomcat版本过高会出现错误
An invalid character [32] was present in the Cookie value
这个错误是由于格式化的时间字符串中有空格,而cookie的值中不能有空格([32]),解决办法是
解决问题的方法其实很简单,只要字符串中不存在空格即可成功。
思路:用其他cookie允许的字符代替空格“ ”,之后记得换回来即可,程序成功运行。
三、Session技术
session技术是基于cookie技术的
学习内容包括两块内容
- 怎样创建一个专属一个客户端的session区域
- 怎样向session区域中存取数据
发送编号JSESSIONID(用于存储session编号的)
和根据编号去寻找session区域位置,这些操作是客户端和服务器自动完成,不要手动编码。
1、获得session对象
// 创建属于该客户端(会话)的私有session区域
HttpSession session = request.getSession();
//获得该session对象的编号id
String sessionId = session.getId();
response.getWriter().write("JSESSIONID=" + sessionId);
request.getSession()方法内部会判断,该客户端是否在服务器端已经存在session
- 如果不存在,那么就会创建一个新的session对象
- 如果该客户端在此服务器上已经存在,则会获得已经存在的该session对象返回(其实质就是根据JSESSIONID判断客户端是否在服务器上已经存在session了)
2、怎样向session中存取数据(session也是一个域对象)
session也是一个存储数据的区域对象,所以也具有以下方法:
- setAttribute(String name, Object o)
- getAttribute(String name)
- removeAttribute(String name)
3、session对象的生命周期(面试题或笔试题)
- 何时创建:第一次执行方法
HttpSesion request.getSession()
的时候创建 - 何时销毁:
- 服务器非正常关闭时
- session失效(过期)(默认时间30分钟,可以在工程的web.xml中进行配置)
- 问题:30分钟时间的起算点是什么?即从何时开始计算30分钟?
答:从不操作服务器端的资源开始计时。例如:打开一个网站,不进行任何操作,开始计时,到29分钟的时候,再访问一次,这时session开始重新计时
- 问题:30分钟时间的起算点是什么?即从何时开始计算30分钟?
<session-config>
<session-timeout>30</session-timeout>
</session-config>
- 手动销毁
session.invalidate()
4、session对象的作用范围
默认在一次会话中,也就是说,一次会话中任何资源共用一个session对象
面试题:
浏览器关闭,session就销毁了。这种说法对吗?
session是存在服务器端,客户端关闭不影响。服务器有自己的销毁方式
5、JSESSIONID的持久化
由于存储JSESSIONID编号的cookie默认是会话级别的,一关闭浏览器就会失效,所以需要为它持久化。
HttpSession session = request.getSession();
session.setAttribute("name", "Tom");
//获得该session对象的编号id
String sessionId = session.getId();
//手动创建一个存储JSESSIONID的cookie,并设置时间,完成JSESSIONID的持久化
Cookie cookie = new Cookie("JSESSIONID", sessionId);
cookie.setPath("/WEB16/");
cookie.setMaxAge(10*60);//10分钟
response.addCookie(cookie);
验证码校验示例代码
// 验证用户密码之间先进行验证码校验
// 获得用户在页面输入的验证码
String checkCode_client = request.getParameter("checkCode");
// 获得生成图片的文字的验证码
String checkCode_session = (String) request.getSession().getAttribute("checkCode");
// 对比用户输入的和生成的验证码是否一致
if (!checkCode_client.equals(checkCode_session)) {
request.setAttribute("loginErrorInfo", "您的验证码不正确");
request.getRequestDispatcher("/login.jsp").forward(request, response);
return;
}
总结
会话技术
- Cookie技术:存到客户端
- 发送cookie
- Cookie cookie = new Cookie(name, value);
- cookie.setMaxAge(秒);
- cookie.setPath();
- response.add(cookie);
- 获得cookie
- Cookie[] cookies = request.getCookies();
- cookie.getName();
- cookie.getValue();
- 发送cookie
- Session技术:存到服务器端,借助cookie存储JSESSIONID,涉及它的持久化(借助cookie);session是一个域对象
HttpSession session = request.getSession();
session.setAttribute(name, value);
getAttribute(name);
Session的生命周期- 创建:第一次指定request.getSession()
- 销毁:三种方式,服务器关闭、session失效/过期、手动关闭session.invalidate()
- session作用范围:默认一次会话中(借助cookie将JSESSIONID持久化)
Java EE会话技术Cookie和Session的更多相关文章
- Java web 会话技术 cookie与session
一.会话 会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. 会话过程中要解决的一些问题 每个用户在使用浏览器与服务器进行会话的过程 ...
- Servlet 会话技术cookie和session
会话技术 Cookie技术:会话数据保存在浏览器客户端. Session技术:会话数据保存在服务器端. 一.Cooke技术 1. 特点 Cookie技术:会话数据保存在浏览器客户端. 2 .Cooki ...
- 会话技术: Cookie 和 Session
会话技术 会话技术:从浏览器开始访问服务器,到关闭浏览器,这期间发生了许多次请求和响应,这个过程就叫做一次会话. Cookie 和 Session 都是处理会话技术的两种具体实现,Cookie将数据保 ...
- 会话技术cookie与session
目录 会话技术cookie 会话技术 cookie 服务器怎样把Cookie写 给客户端 服务器如何获取客户端携带的cookie session session简介 Session如何办到在一个ser ...
- JAVA基础之会话技术-Cookie及Session
至此,学习Servlet三个域对象:ServletContext(web项目).request(一次请求).Session(一个客户端)!均有相同的方法! 从用户开始打开浏览器进行操作,便开始了一次会 ...
- 会话技术cookie和session详解
什么是会话 会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. 会话技术解决了什么问题 每个用户与服务器进行交互的过程中,各自会有一 ...
- java ->会话技术Cookie&Session
会话技术Cookie&Session 会话技术简介 存储客户端的状态 由一个问题引出今天的内容,例如网站的购物系统,用户将购买的商品信息存储到哪里?因为Http协议是无状态的,也就是说每个客户 ...
- 简述会话跟踪技术——Cookie和Session
简述会话跟踪技术--Cookie和Session 本篇文章将会简单介绍Cookie和Session的概念和用法 会话跟踪技术 首先我们需要搞清楚会话和会话跟踪的概念: 会话:用户打开浏览器,访问Web ...
- Django2.2 会话技术cookie session token的区别以及实例介绍
一.区别: 本人见解:使用自定义数据项进行加密,作为唯一身份识别,登陆时写入cookie(session基于这个).在显示相关数据 1.cookie 属于客户端会话技术(数据存储在客户端) 默认的Co ...
随机推荐
- tensorflow2 矩阵乘法问题
tensorflow2再做矩阵相乘的时候如果维度有None,则矩阵相乘结果不对. 也不知道为什么,只能用矩阵对应元素相乘在相加的形式来实现矩阵相乘,这个困扰了我好几天,所以记下来. inputs_ti ...
- 20180711-Java Number类
下面是一个装箱与拆箱的例子: public class Test{ public static void main(String args[]){ Integer x = 5; // boxes in ...
- [hadoop](3) MapReduce:创建计数器、任务状态和写入日志
前言 本章主要讲述了如何在mapreduce任务中添加自定义的计数器,从所有任务中聚合信息,并且最终输出到mapreduce web ui中得到统计信息. 准备工作 数据集:ufo-60000条记录, ...
- python-zx笔记9-单元测试
unittest核心要素 1.TestCase 一个TestCase的实例就是一个测试用例.什么是测试用例呢?就是一个完整的测试流程,包括测试前准备环境的搭建(setUp),执行测试代码(run),以 ...
- iOS打印各种类型数据
整型占位符说明 : %d : 十进制整数, 正数无符号, 负数有 “-” 符号; %o : 八进制无符号整数, 没有 0 前缀; %x : 十六进制无符号整数, 没有 0x 前缀; %u : 十进制无 ...
- 移动端rem布局屏幕适配插件(放js中便可使用)
/* doc:不用管:document对象 win:不用管:window对象 design:注意:设计稿的尺寸/物理像素*/ (function (doc, win,design) {// alert ...
- Ural Amount of Degrees(数位dp)
传送门 Amount of Degrees Time limit: 1.0 secondMemory limit: 64 MB Description Create a code to determi ...
- 001---mysql分库分表
mysql分库分表 一.整体的切分方式 1.分库分表:即数据的切分就是通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)中,以达到分散单台设备负载的效果 2.数据的切分根 ...
- Python 学习笔记17 文本 - 读写
在我们的编程过程中,我们经常需要对文件进行读写操作. 在Python中,对文本的读写非常的方便,只需要简单的几行代码就可以实现. 我们首先新建一个文本文件"Text.txt", 里 ...
- 终端参数上报后,平台通过tcp协议接收到相应数据并处理。
终端将终端参数以json格式的数据发送至平台.终端上电后上报,可以不认证直接上报. 实现流程如下. 1.设置终端参数上报的协议类型,例如:0x0000. public static final int ...