Java Web-Cookie和Session
Java Web-Cookie和Session
会话
会话的概念
一次会话是指浏览器从浏览器第一次给服务器发送请求建立到其中一方断开结束会话的一个过程。它包含多次请求和响应。
会话是用来在一次会话的范围内的多次请求间共享数据的
会话分为两类:客户端会话技术(cookie)和服务器端会话技术(session)。
- cookie:将数据存储到客户端
- session:将数据储存到服务器端
Cookie
cookie保存在浏览器本地、一个会话中每一次请求都携带着它
快速入门
步骤:
服务器创建cookie对象,绑定数据
new Cookie(String name,String value)
发送cookie对象给浏览器
response.addCookie(Cookie cookie)
获取浏览器返回的cookie,拿到数据
Cookies[] request.getCookies()
代码:
cookieDemo1.java
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
cookie快速入门
*/
//1.创建cookie对象
Cookie c=new Cookie("msg","hello");
//2.通过添加到response从而发送cookie给客户端
//这样客户端的浏览器上就会保存一个cookie了
response.addCookie(c);
}
cookieDemo2.java
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
cookie快速入门
*/
//3.获取cookie,cookie可以有多个
Cookie[] cookies = request.getCookies();
//4.遍历cookies,获取数据
if(cookies!=null){
for (Cookie c:cookies
) {
String name = c.getName();
String value = c.getValue();
System.out.println(name+":"+value);
}
}
}
注意,如果访问demo1和demo2分别使用的是两个不一样的浏览器,则实际上是两个会话,接收到的cookie是空的
原理分析
cookie的传递在响应头中,以键值对形式传递:set-cookie:msg-hello
浏览器收到后,将响应头中的数据保存到浏览器上(这也是为什么换浏览器就不能用了),下一次发送请求时将cookie放在请求头中发送到服务器:cookie:msg=hello
。
其实这些dirty work都被浏览器和服务器软件做了,程序员只是直接调用封装好了的API
有几个要点:
一次可以发送多个cookie:可以创建多个cookie对象,使用response调用多次addCookie方法发送cookie即可
默认情况下,cookie是保存在内存中的。当浏览器关闭后,cookie数据被销毁
但是,cookie也可以设置以实现持久化存储,这是通过调用cookie的方法setMaxAge(int seconds),也即设置cookie的生命周期来实现:
- 设置正数:将cookie数据写入硬盘文件中,持久化存储,传入的参数表示cookie的存活时间
- 负数:默认值
- 零:特殊情况,表示删除cookie信息(因为服务器不能操作客户端的文件,只能通过这种方式给出指令)
在tomcat8之前,cookie不能直接存储中文数据。在版本8以后就支持了,也不会有乱码问题。如果是8版本之前,需要先将中文数据转码,一般采用URL编码(也就是get方式传输中文参数时候使用的)
cookie是有获取范围的:假设在一个tomcat服务器中部署了多个web项目,那么项目间的cookie默认不能共享。但也可以进行设置:setPath(String path),设置cookie的获取范围,path默认设置为当前虚拟目录(/xxx),但如果设置为/,也就是服务器的根路径,就可以在同一台服务器上的项目间共享cookie了
但是,如何实现跨服务器的共享呢?这就需要cookie另一个方法setDomain(String path)了,如果设置一级域名相同,那么多个服务器之间cookie可以共享,例如:
setDomain(".baidu.com")
,那么只要一级域名是baidu.com的就可以共享cookie存储数据在客户端浏览器,相比于保存在服务器上,安全性会低很多,也很容易丢失
浏览器对于单个cookie的大小有限制(一般在4kb左右,因为cookie的本意就是用来存储小数据的),以及对于同一个域名下的总cookie数量有限制(一般限制在20个以内)。当然,我们在客户端也可以进行设置:
我们也可以对浏览器保存的cookie进行管理(这里显示的都是持久化存储的,也就是在硬盘中存储的):
由于5和6,所以cookie一般用于存储少量的、不太敏感和重要的数据。cookie的作用是,在不登录的情况下,完成服务器对客户端的身份识别,以达到在不登录的前提下进行一些个性化设置并持久生效的效果。当然,如果登录了之后,就可以在服务器端记录用户的设置了,就不需要使用cookie这种方法了。
Session
概念
session是服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器的对象中。
Session和cookie一样,都是域对象
快速入门
获取HttpSession对象:HttpSession session=request.getSession();
- Object getAttribute(String name)
- void setAttribute(String name,Object value)
- void removeAttribute(String name)
示例代码:
SessionDemo1.java
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//使用session共享数据
//1.获取session
//此时通过cookies中的session-id来获取该会话的session,如果没有的话就在服务器创建一个
HttpSession session = request.getSession();
//2.存储数据
session.setAttribute("msg","hello session");
}
SessionDemo2.java
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//使用session共享数据
//1.获取session
HttpSession session = request.getSession();
//2.获取数据
Object msg = session.getAttribute("msg");
System.out.println(msg);
}
同样的,换了个浏览器之后就是两次不同的会话了,不能共享数据
原理分析
服务器如何确保在一次会话范围内,多次获取的session对象是同一个?
Session是依赖于cookie的!第一次获取session时,没有对应的cookie,此时会在内存中创建一个session对象并返回一个id,并通过
set-session:JSESSIONID=id
来讲session的id保存在浏览器的cookie中这样,在之后的请求中,服务器可以读取cookie中的session id,就知道该会话对应的session是哪个了。这也解释了为什么session是保存在服务器上的,但是依然只在一次会话中有效客户端关闭前后,默认两次获得的session不是同一个(因为不是一个会话了,cookie换了),但是可以通过持久化保存cookie实现关闭浏览器后依然获得同样的session
从理论上来说,客户端不关闭、服务器关闭后,两次获取的session不一样。因为session也是保存在服务器内存而不是磁盘书上的
但是这同样会造成问题:会造成用户数据的丢失、降低用户体验。如何解决这一个问题呢?
解决方法就是采用session的序列化-反序列化:
首先,关于Java序列化,可以看我的这篇博文
- 在服务器正常关闭之前,我们将session对象序列化后保存到硬盘上。session序列化之后的文件会保存在work目录下
- 在服务器启动后,我们设置服务器自动地将硬盘中序列化后的session文件转为内存中的session对象
这是原理层面的,但是这部分内容已经被tomcat实现了:现在我们使用tomcat服务器,默认就实现了序列化-反序列化的功能。
但是,使用IDEA直接启动服务器、部署项目的话是不能实现该功能的。原因是IDEA在关闭-启动tomcat服务器时会执行一个操作:将work目录删除并重新创建,这就使得服务器关闭时保存在work目录下的session文件被销毁了。这也从某种意义上说明了IDEA只适合开发项目,真正部署项目到生产服务器上时还是直接启动tomcat好使。
session什么时候会被销毁?
session有三种情况会被销毁:
服务器关闭
session对象调用invalidate()方法使自己失效
session默认失效时间为30分钟。
这个时间是可配置的。我们可以在tomcat的conf/web.xml中找到如下图的配置,修改这里的时间就能修改默认失效时间。
同时,每一个项目也可以在自己的web.xml中单独进行设置,项目的设置会覆盖tomcat这里的默认设置
和cookie只能存储字符串不同,session对存储的对象类型没有要求,对对象的大小同样没有要求。
这一点也好理解:cookie要在每一次访问时传输,所以大小必须被严格控制。而session一直保存在服务器端不动,所以大小也就显得不重要了。也是因为同样的原因,session是数据安全的,而cookie则相对显得不安全
相比于我们在这篇博文介绍的ServletContext,我们更常使用session和cookie来存储一次会话的数据,因为它的作用域更合适、风险更小
Java Web-Cookie和Session的更多相关文章
- Java Web Application使Session永不失效(利用cookie隐藏登录)
在做 Web Application 时,因为 Web Project 有 session 自动失效的问题,所以如何让用户登录一次系统就能长时间运行三个月,就是个问题. 后来,看到 session 失 ...
- Java web Cookie详解(持久化+原理详解+共享问题+设置中文+发送多个Cookie)
Java web Cookie详解 啥是cookie? 查询有道词典得: web和饼干有啥关系? 这个谜底等等来为大家揭晓 会话技术 web中的会话技术类似于生活中两个人聊天,不过web中的会话指的是 ...
- 求高手帮忙解决一下问题Java Web Cookie实例
package cn.com; import java.io.IOException; import java.io.PrintWriter; import java.util.LinkedHashM ...
- Java之Cookie与Session
Cookie.Session Cookie:服务端生成Cookie发给客户端用于认证 Session:服务端进行进行登记,每人有不同的Session session与cookie的区别 Cookie: ...
- A candidate solution for Java Web Application - current session
Motivation Do it once, resue for ever. Audience myself, Java Web developers Scope 应用案例 图书借阅系统 阶段1需求: ...
- web cookie and session
一.什么是会话? 打开一个浏览器,访问多个网址后,再关掉浏览器,这一整个过程就是会话. 二.cookie技术 这是客户端保存临时数据的技术,主要用于保存用户的登录信息及其它需要保存的数据,如购买与结帐 ...
- go web cookie和session
cookie是存储在浏览器端,session是服务器端 cookie是有时间限制的,分会话cookie和持久cookie,如果不设置时间,那周期就是创建到浏览器关闭为止.这种是会话cookie,一般保 ...
- Java Web Cookie
一.什么是cookie? 1.Cookie能使站点跟踪特定访问者的访问次数.最后访问时间和访问者进入站点的路径 2.Cookie能告诉在线广告商广告被点击的次数,从而可以更精确的投放广告 3.Cook ...
- java web Cookie浅谈
1.会话控制 > Http协议 Http协议两个缺陷: 1.HTTP协议是纯文本的 2.HTTP协议是无状态的 服务器不能简单的通过HTTP协议来区分多次请求是否发自同一个用户 虽然通过HTTP ...
- java web 中分布式 session 的实现
已经有现成的库现实现分布式的 session 管理: 1.memcached-session-manager. 2.tomcat-redis-session-manager. 3.spring-ses ...
随机推荐
- kotlin 委托类的初始化函数
import java.beans.AppletInitializer import kotlin.reflect.KProperty fun main(arg: Array<String> ...
- 搭建无人值守安装服务器(CentOS)
使用PXE+DHCP+TFTP+Kickstart+FTP搭建无人值守安装服务器.一般只有频繁安装系统才会搭建无人值守安装服务器. 虚拟机环境:youxi1,CentOS7系统双网卡,一个网卡桥接模式 ...
- 【S/4系列专栏】关于S/4你想知道的问题与答案
转自:http://www.sohu.com/a/152235225_652820 S/4系列专栏将收集国内的实施案例,从各个角度进行分析,包括S/4的由来,S/4各个版本的变化,企业是否有必要选择S ...
- js 高级程序设计 第三章学习笔记——Number数据类型需要注意的事项
1.浮点数值 虽然小数点前面可以没有整数,但是并不推荐这种写法. 由于保存浮点数值需要的内存空间是保存整数值的两倍,因此ECMAScript会不失时机地将浮点数值转化为整数数值.显然,如果小数点后面没 ...
- Spring Aop(九)——基于正则表达式的Pointcut
转发地址:https://www.iteye.com/blog/elim-2396525 基于正则表达式的Pointcut JdkRegexpMethodPointcut Spring官方为我们提供了 ...
- 如何用最快的速度读出大小为10G的文件的行数?弄懂 python 的迭代器
with open('rm_keys.txt', 'r', encoding = 'utf-8') as f: count = 0 for line in f: 7 count += 1 print( ...
- 一个老程序员PHP程序员说的话(用来提醒自己)
我,一个老程序员,也是一个学生,把玩过甚多语言,大多不精.我既非名牌学校,也不是高学历,仅代表一部分比较蛋疼的人.接触PHP也是很早了,从04年的OFSTAR开始的,到现在六年了,期间也接触过不少的语 ...
- 除了 UCAN 发布的鹿班和普惠体,这些设计工具也来自阿里
在 4 月 27 日的 UCAN 2019 设计大会上,阿里巴巴对外发布了一款全新免费字体——阿里巴巴普惠体.其实,作为经济体的阿里巴巴,这些年早已默默推出了很多实用的设计工具,比如大名鼎鼎的 Ico ...
- Arduino基础入门—3.连接 IIC 1602 LCD显示文字
1. IIC转接板介绍 Arduino Uno R3开发板的外部IO口是非常有限的.在驱动LCD1602时,尽管我们的数据线使用了4线,相对于8线方式减少一半,但是在需要外接多种传感器的应用中,4线驱 ...
- C/C++编程
基本的数据类型: 整型 浮点型(单精度.双精度) 在c语言中,所有的变量声明必须在任何执行语句之前(对当前域来说), 否则编译的时候会出现变量是未声明的标识符的错误. main 入口参数:argc 和 ...