浅谈Cookie与Session技术
一、什么是状态管理
将客户端与服务器之间多次交互当做一个整体来看,并且将多次交互所涉及的数据(状态)保存下来。
会话:当用户打开浏览器,访问多个WEB资源,然后关闭浏览器的过程,称之为一个会话,选项卡,弹出页面都属于这个会话,且共享同一个session。
注意:具体会话和浏览器版本,厂商有关,如IE7及以下,每开一个浏览器都创建一个新的session,而IE8及以上,则实现多个浏览器共享同一个session。因为IE8及以上,都共享同一个进程,只开辟一个内存空间。目前较多主流的浏览器都实现同一台主机上的多个浏览器,共享同一个进程。
二、如何进行状态管理
方式一:将状态保存在客户端。方式二:将状态保存在服务器端。
三、cookie技术(客户端技术)
(1)什么是cookie
a、cookie是一种客户端的状态管理技术b、当浏览器向服务器发送请求的时候,服务器会将少量的数据以set-cookie消息头的方式发送给浏览器,当浏览器再次访问服务器时,会将这些数据以cookie消息头的方式发送给服务器。
(2)如何创建一个cookie
Cookie c = new Cookie(String name,String value);response.addCookie(c);默认情况下,cookie保存在浏览器内存中
(3)cookie的查询
Cookie[] cookie = request.getCookies();
注意:该方法有可能返回nullString cookie.getName():查找cookie的名字String cookie.getValue():查找cookie的值
(4)cookie的生存时间
cookie.setMaxAge(int seconds):cookie的保存时间seconds>0:浏览器会将cookie保存在硬盘上,超过指定时间会删除该cookieseconds<0:缺省值,只将cookie保存在内存中,只要浏览器不关闭,cookie就一致保存,浏览器一旦关闭,cookie就会被清空。seconds=0:立即删除cookie,如要删除一个叫userID的cookie,那么可以这么做:Cookiec = new Cookie("userID","");c.setMaxAge(0);response.addCookie(c);
(5)cookie的编码问题
cookie只能保存ascii字符,对于不合法的字符(如中文)需要转换成ascii码
例:Cookie cookie3 = new Cookie("realname",URLEncoder.encode("姓名","utf-8"));
(6)cookie的路径问题
a、什么是cookie的路径问题?浏览器在向服务器发送请求时,会比较cookie的路径要与访问的服务器的路径是否匹配,只有匹配的cookie才会发送给服务器。b、cookie的默认路径默认路径等于创建该cookie的组件路径c、匹配规则浏览器要访问的路径必须是cookie的路径或者其子路径时,才会发送对应的cookied、设置cookie的路径cookie.setPath(String path)如:cookie.setPath("/appname");这样保证这个cookie可以被整个web应用访问。
(7)cookie域
setDomain:设置cookie域,指的是访问某个域的时候,才会带入cookie,访问其他域,不会带入cookie。默认会禁止该设置,因为安全性较差,如,访问baidu.com,baidu.com写一个域是google.com的cookie,那么访问google.com的时候会带入baidu.com的cookie,从而会实现攻击的效果。
(8)cookie的限制
a、cookie可以被用户禁止b、cookie不完全,敏感数据,比如密码、账号等需要加密。c、cookie的大小有限制,大约为4K左右d、cookie的个数也有限制,大约是300个左右e、每个站点最多保存20个cookief、cookie只能够保存字符串。
四、session技术(服务器端)
(1)什么是session?
a、session是一种服务器端的状态管理技术。b、session是基于cookie的技术。c、当浏览器访问服务器时,服务器会创建一个session对象(该对象有一个唯一的id号,称之为sessionId)服务器在默认的情况下,会将sessionId以cookie的方式,发送给浏览器,浏览器会将sessionId保存到内存中。当浏览器再次访问服务器时,会将sessionId发送给服务器,服务器依据sessionId就可以找到之间创建的session对象。
(2)如何获取session对象?
方式一:HttpSession s = request.getSession(boolean flag);当flag=true时,服务器会先查看请求当中有没有sessionId,如果没有,则创建一个session对象。如果有,会依据sessionId查找对应的session对象。如果找到,则返回该session对象,如果找不到,则创建一个新的session对象。当flag=false时,服务器会先查看请求当中有没有sessionId,如果没有则返回null,如果有,会依据sessionId查找对应的session对象。如果找到,则返回该session对象,如果找不到,返回null。方式二:HttpSession s = request.getSession();等价于request.getSession(true);
(3)常用方法
String serssion.getId();// 得到session的ID
session.setAttribute(String name,Object obj);// obj最好实现序列化Serializable接口,应为服务器在持久化session时,会使用java序列化协议。
session.getAttribute(String name);// 如果name不存在则返回null
session.removeAttribute(String name);// 删除session中的指定属性
(4)session超时
所谓session的超时,指的是服务器会将空闲时间过长的session对象从内存空间删除掉,原因是过多的session对象会影响程序的正常运行,会占用服务器的内存空间。大部分服务器都会有一个缺省的超时限制,一般是30分钟,可以修改服务器的缺省超时限制。如修改tomcat的session超时时间,可以在conf/web.xml中的
<session-config><session-timeout>30</session-timeout></session-config>
也可以将以上配置放到某个WEB应用的web.xml中,这样可以特定设置某个WEB应用的session超时时间。另外,还可以通过session.setMaxInactiveInterval(int seconds);设置session的超时时间。
(5)session的生命周期
session的创建:当用户访问某个可以创建session的servlet的时候,该servlet才会创建session。当session超过默认时间或用户指定的session时间后,session才会消亡。
(6)删除session
session.invalidate();
(7)持久化session方案
session默认是存储在浏览器内存中,默认时间是30分钟(根据不同的WEB服务器设置而定)。且session也是通过cookie来实现发送到浏览器内存中的。所以可以考虑用cookie来替换该session。如果用户在中途关闭浏览器的话,那么session就随着浏览器内存的释放而释放,那么如果想持久化session的话,可以考虑使用cookie技术。
Step1、获取sessionID。Step2、通过JSESSIONID,然后将sessionID的值写入cookie,在通过设置保存时间,路径,来持久化该session。
(8)URL地址编码(用户禁用cookie的解决办法)
如果用户禁用了cookie,那么在编写超链接的时候,必须使用URL编码,即:
response. encodeURL(url);
什么是URL重写?
简单的说,如果某个组件需要session机制的支持,且用户禁止了cookie,则不能直接使用该组件的地址去访问,而应该使用服务器生成的组件的地址(会在组件的地址后面添加sessionId)去访问。如何重写?
用在连接地址,表单提交地址。
response.encodeURL(String url);
如果是重定向。
sesponse.encodeRedirectURL(“list.jsp”);
这样编译过的URL地址就会自动在后面添加用户session的id号,那么所有的连接地址就会按如下格式进行输出,即每个地址都记录了用户的信息:
href='/JavaWeb/servlet/BuySession;jsessionid=283087307F0E79CC62208BDCF79FC52A'
这种方式不能实现用户数据持久化。
(9)session的相关细节
如果即使用了URL地址编码,也设置了写出cookie,那么第一次访问的时候服务器会即带入cookie同时也进行URL地址编码,当再次访问服务器时,服务器已经判断出了浏览器是否禁用了cookie,如果没有禁用,则使用cookie写入的方式,如果禁用了则使用URL地址编码的方式
(10)session的优缺点
优点:1、session相对安全。2、session能够保存的数据类型更丰富。3、session能够保存的数据大小没有限制。
缺点:1、session需要将所有数据写在服务器端,所以服务器会占用过多的内存空间,会影响服务器性能。可以考虑使用cookie或数据库来保存数据。
(11)session案例
a、session登录验证
step1、在登录成功以后,在session对象上绑定数据,比如:session.setAttribute(“user”,user);step2、对需要保护的资源(只有登录成功以后才能访问的资源,比如主页),添加session验证代码:Object obj = session.getAttribute(“user”);If(obj==null)就跳转到登录界面
b、验证码生成一个验证码,然后将验证码存储到session中,然后从session中取出验证码与客户提交的验证码进行比对,这是一个典型的session应用。
浅谈Cookie与Session技术的更多相关文章
- 浅谈cookie 和session 的区别
具体来说 cookie 是保存在“客户端”的,而session是保存在“服务端”的 cookie 是通过扩展http协议实现的 cookie 主要包括 :名字,值,过期时间,路径和域: 如果cooki ...
- (进阶篇)浅谈COOKIE和SESSION关系和区别
COOKIE介绍 cookie 常用于识别用户.cookie 是服务器留在用户计算机中的小文件.每当相同的计算机通过浏览器请求页面时,它同时会发送 cookie.通过 PHP,您能够创建并取回 coo ...
- 浅谈cookie和session
Cookie简介 Cookie(复数形态Cookies),中文名称为“小型文本文件”,指某些网站为了辨别用户身份或存储用户相关信息而存储在用户本地终端(Client Side) 上的数据(通常为加密数 ...
- 浅谈cookie与session的区别
cookie用的是在客户端保持状态的方案(它是在用户端的会话状态的存贮机制),前端也可以来设置他 所有浏览器都识别,并且会缓存在浏览器中. cookie是以key=value这种键值对的形式保存,每个 ...
- 浅谈cookie、session
揭秘Cookie: cookie说的直白点就是保存在用户浏览器端的一个键值对,举个例子,你现在登录了京东商城,你把浏览器关闭之后,你再打开京东,你还是可以对你的账户继续操作,已经购买的商品,订单都是可 ...
- 浅谈Cookie、Session与Cache的区别
以前实现数据的缓存有多种方法,如客户端的Cookie,服务器端的Session.Application. 一.Cookie Cookie是保存客户端的一组数据,主要用来保存用户的个人信息,主要存放浏览 ...
- 浅谈cookie 和 session
一. cookie 定义:保存在浏览器本地上的一组组键值对 特点: 由服务器让浏览器进行设置的 浏览器保存在浏览器本地 下次访问时自动携带 应用: 登录 保存浏览习惯 简单的投票 使用cookie的原 ...
- 浅谈 cookie 和 session
1.关闭浏览器后,session是否还存在? session在服务器和客户端各保留一个副本,关闭浏览器与否和session是否存在没有任何关系. session采取的是服务器端保持状态的方案,它存储在 ...
- 浅谈android代码保护技术_ 加固
浅谈android代码保护技术_加固 导语 我们知道Android中的反编译工作越来越让人操作熟练,我们辛苦的开发出一个apk,结果被人反编译了,那心情真心不舒服.虽然我们混淆,做到native层,但 ...
随机推荐
- 【阅读笔记】《C程序员 从校园到职场》第六章 常用文件操作函数 (Part 1)
参考链接:https://blog.csdn.net/zhouzhaoxiong1227/article/details/24926023 让你提前认识软件开发(18):C语言中常用的文件操作函数总结 ...
- JavaWeb基础-servlet
Servlet简介 Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向浏览器输出数据),需要完成以下2个步骤: 1.编写一个Java类,实现s ...
- Java容器解析系列(0) 开篇
最近刚好学习完成数据结构与算法相关内容: Data-Structures-and-Algorithm-Analysis 想结合Java中的容器类加深一下理解,因为之前对Java的容器类理解不是很深刻, ...
- springcloud Eureka学习笔记
最近在学习springcloud,抽空记录下学习笔记;主要记录Eureka的实现过程和高可用性的实现 Eureka是一个服务治理框架,它提供了Eureka Server和Eureka Client两个 ...
- Python基础03_pycharm
pycharm的安装还是很简单的,一路next. 看起来Jet Brains 家的产品长相都差不多啊. 主要是create new project时,路径和解释器的选择,我电脑上有2.7和3.6 所以 ...
- Linux下查看CPU型号,内存大小,硬盘空间的命令
1 查看CPU 1.1 查看CPU个数 # cat /proc/cpuinfo | grep "physical id" | uniq | wc -l 2 **uniq命令:删除重 ...
- 【转】spring boot mybatis 读取配置文件
spring boot mybatis 配置整理 一.加载mybatis的配置 1.手写配置,写死在代码里 import java.io.IOException; import java.util.P ...
- 初始化 CSS 样式
为什么要初始化 CSS 样式 因为浏览器的兼容问题,不同浏览器对有些标签的默认值是不同的,如果没对 CSS 初始化往往会出现浏览器之间的页面显示差异. 当然,初始化样式会对 SEO 有一定的影响,但鱼 ...
- psql备份和恢复(ubuntu)
备份 sudo pg_dump -U username -f filename.sql dbname 恢复 psql -U username -f filename.sql dbname -- ...
- 支持Oracle的模糊查询和精准查询
相信所有的软件开发者都做过页面上的查询功能,而且很多都需要既支持模糊查询的,也需要支持精准查询的,而且不需要增加多余的功能,只需要在文本框中输入包含类似*之类的符号即可. 下面的方法就是通过*来判断到 ...