JavaWeb学习小结Cookie和Session
Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie
与Session
。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。
一次会话指的是:就好比打电话,A给B打电话,接通之后,会话开始,直到挂断电话,该次会话就结束了,而浏览器访问服务器,就跟打电话一样,浏览器A给服务器发送请求,访问web程序,该次会话就已经接通,其中不管浏览器发送多少请求(就相当于接通电话后说话一样),都视为一次会话,直到浏览器关闭,本次会话结束。其中注意,一个浏览器就相当于一部电话,如果使用火狐浏览器,访问服务器,就是一次会话了,然后打开google浏览器,访问服务器,这是另一个会话,虽然是在同一台电脑,同一个用户在访问,但是,这是两次不同的会话。
说到Cookie
和Session
先从二者的英文单词含义说起,Cookie
翻译为中文是小饼干的意思,Session
翻译成中文是会话的意思。从翻译就能看出来,Cookie
是服务器返回给浏览器的一些断断续续的东西,而Session
是一种会话机制。
Session
,而session是如何实现状态保持的呢?Cookie
作用就体现出来了!Cookie
信息到服务端。实际上大多数的应用都是用Cookie
来实现Session
跟踪的,第一次创建Session
的时候,服务端会在HTTP协议中告诉客户端,需要在 Cookie
里面记录一个Session ID
,以后每次请求把这个会话ID发送到服务器,我就知道你是谁了。需要注意的是,由于客户端需要接收、记录和回送Session
对象的ID,因此,通常情况下,Session要借助Cookie技术来传递ID属性的.Cookie
是客户端技术,程序把每个用户的数据以Cookie
的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。我们通一个图能直观了解Cookie
实现原理:
Cookie
的内容主要包括:名字,存储数据(值),作用时间(过期时间),作用范围(路径和域),性能。
Cookie | 主要内容 |
---|---|
定义 | Cookie 是服务端给客户端的数据,数据存储于客户端(浏览器),即本地,如IE浏览器把Cookie 信息保存在类似于C:\windowsCookies的目录下。所以 |
名字 | 在创建一个Cookie 时,我们给定Cookie 名 |
存储数据 | 只能存储 String 类型的对象(中文或者空格需要转码) |
作用时间 | Cookie 可以通过 setMaxAge()方法,(后面介绍),设置过期时间,如果不设置过期时间,则表示这个Cookie 的生命期为浏览器会话期间,只要关闭浏览器窗口,Cookie 就消失了。这种生命期为浏览器会话期的Cookie 被称为会话Cookie 。会话Cookie 一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。如果设置了过期时间,浏览器就会把Cookie 保存到硬盘上,关闭后再次打开浏览器,这些Cookie 仍然有效直到超过设定的过期时间。 |
作用范围 | Cookie 通过设置指定作用域,只能在指定作用域有效。默认Cookie 只对当前访问路径所属的目录及其子目录有效。 |
性能 | Cookie 存在客户端对服务器没影响 |
我们用代码来介绍操作Cookie
的API:
//创建一个Cookie
Cookie cookie = new Cookie("mycookie", "first cookie");//左边参数为cookie名,右边参数为cookie值
//取得Cookie的名字
cookie.getName();
//设置Cookie的值
cookie.setValue("rename second cookie");
//取得Cookie的值
cookie.getValue();
//设置Cookie的最大保存时间,不设置cookie的过期时间默认为-1,表示关闭浏览器即结束生命
cookie.setMaxAge(1*60*60*24);//24小时失效,(单位为s)
//获取Cookies的有效期
cookie.getMaxAge();
//设置在某个域名下生效
cookie.setDomain("localhost");//默认为localhost
//获取cookie的有效域
cookie.getDomain();
/*设置cookie的有效路径,
比如把cookie的有效路径设置为"/xdp",
那么浏览器访问"xdp"目录下的web资源时,都会带上cookie,
再比如把cookie的有效路径设置为"/xdp/gacl",
那么浏览器只有在访问"xdp"目录下的"gacl"这个目录里面的web资源时才会带上cookie一起访问,
而当访问"xdp"目录下的web资源时,浏览器是不带cookie的*/
cookie.setPath("/");//默认为 / ,对该站点的所有目录下的访问路径都有效
//获取cookie的有效路径
cookie.getPath();
//删除cookie,注意:删除cookie时,path必须一致,否则不会删除
cookie.setMaxAge(0);//将cookie的有效期设置为0,命令浏览器删除该cookie
//添加到response
response.addCookie(cookie);
//获取cookies
Cookie[] cookies=request.getCookies();
//cookies内的值拿出,通过判断cookie的名字拿到值
//cookie内的值拿出
String lastTime=null;
//不为空则读出来
if (cookies!=null && cookies.length>0){
for(Cookie cookieNew:cookies){
String cookieRequestName=cookieNew.getName();
if ("lastTime".equals(cookieRequestName)){
lastTime=cookieNew.getValue();
break;
}
}
}
要想在cookie
中存储空格和中文,那么必须使用URLEncoder类里面的encode(String s, String enc)方法进行中文转码。否则会出现异常,报错无法识别。
//设置cookie的内容Value
Strking Value="我打了空格 +中文我";
//进行转码
Value=URLEncoder.encode(Value, "UTF-8");
//创建cookie
Cookie cookie = new Cookie("mycookie",Value);
//发送cookie
response.addCookie(cookie);
在获取Cookie
中的中文和空格数据时,再使用URLDecoder类里面的decode(String s, String enc)进行解码。
URLDecoder.decode(cookies.getValue(), "UTF-8");
Cookie常见问题及解决:共享问题cookie.setpath()详解.
之前我们介绍的Cookie
是把用户的身份信息存在了客户端,而Session
说白了就是把用户的信息(状态)保存在了服务端。
Session
机制是一种服务器端的机制,服务器使用一种类似于散列表的结构来保存信息。
当程序需要为某个客户端的请求创建一个Session
的时候,服务器首先检查这个客户端的请求里是否已包含了一个Session
标识称为Session ID
,如果已包含一个Session ID
则说明以前已经为此客户端创建过Session
,
服务器就按照Session
ID把这个Session
检索出来使用,如果客户端请求不包含Session ID
,则为此客户端创建一个Session
并且生成一个与此Session
相关联的Session ID
,它的值是一个既不会重复,又不容易被找到规律以仿造的字符串,这个Session ID
将被在本次响应中返回给客户端保存。 保存这个Session ID
的方式可以采用Cookie
,这样在会话过程中客户端(浏览器)可以自动的按照规则把这个Session ID
发送给服务器。
所以当客户端(浏览器)关闭,就再也访问不到之前的Session ID
了,Session要借助Cookie技术来传递ID属性的,但是还可以访问之前创建的Session
。
Session
的主要内容:存储数据(值),作用时间(过期时间),作用范围(路径和域),性能
Session | 主要内容 |
---|---|
定义 | Session 是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的Session 对象,由于Session 为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的Session 中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的Session 中取出数据为用户服务。 |
存储数据 | 能够存储任意的 java 对象 |
作用时间 | 由于Session 是保存在了服务端,所以当用户关闭浏览器时Session 并不会消失。一般Session 保存在服务器的内存中,当然也可以持久化到硬盘或者数据库中。Session 的默认过期时间是30分钟,过期的Session 会被服务器自动的销毁。注意如果大量的创建Session 可能导致服务器的内存溢出。 |
作用范围 | Session 在整个网页都有效 |
性能 | Session 过多时会消耗服务器资源,大型网站会有专门Session 服务器 |
我们用代码来介绍Session
常用方法:
//获取session,没有则创建
HttpSession session = request.getSession();
//获取SessionId
session.getId()
//获取存储的某个值
session.getAttribute("key");
//存储数据,value是object类型
session.setAttribute("key","value");
//设置会话的过期时间(单位:秒),默认30分钟
session.setMaxInactiveInterval(1*60*60);
//获取session创建的时间
session.getCreationTime();
//获取最后一次修改session的时间
session.getLastAccessedTime()
//移除某个数据
session.removeAttribute("key");
//重置session,使session失效
session.invalidate();
当浏览器不支持Cookie
或者关闭了Cookie
功能时,在会话过程中,如果想 让Web服务器可以保存用户的信息,必须对所有可能被客户端访问的请求路径进 行URL重写。在HttpServletResponse接口中,定义了两个用于完成URL重写的方法。
response.encodeRedirectURL(java.lang.String url) //用于对sendRedirect方法后的url地址进行重写。
response.encodeURL(java.lang.String url) //用于对表单action和超链接的url地址进行重写
URL重写,指的是将Session
的会话标识号以参数 的形式附加在超链接的URL地址后面。对于Tomcat服务器来说,就是将JSessionID
关键字作为参数名以及会话标识号的值作为参数值附加到URL地址 后面。具体使用:
public class IndexServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
//创建Session
request.getSession();
out.write("本网站有如下书:
");
Set<Map.Entry<String,Book>> set = DB.getAll().entrySet();
for(Map.Entry<String,Book> me : set){
Book book = me.getValue();
String url =request.getContextPath()+ "/servlet/BuyServlet?id=" + book.getId();
//response. encodeURL(java.lang.String url)用于对表单action和超链接的url地址进行重写
newurl = response.encodeURL(url);//将超链接的url地址进行重写
out.println(book.getName() + " 购买
");
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
当浏览器禁用了Cookie
后,就可以用URL重写这种解决方案解决Session
数据共享问题。而且response. encodeRedirectURL(java.lang.String url)和response. encodeURL(java.lang.String url)是两个非常智能的方法,当检测到浏览器没有禁用Cookie
时,那么就不进行URL重写了。
Cookie
是服务端给客户端的数据,客户端保存用户信息的一种机制,存在于客户端。Session
是在服务端保存的一个数据结构,会响应给Cookie
一个Session
ID的记录,它是基于Cookie
的一种机制。Session
通过服务器向浏览器发送一个具有Session
Id的会话Cookie
来给用户一个身份标识,在浏览器没有关闭的情况下,会话Cookie
(Session
id)一直存在,服务器中Session
的数据也一直存在。一旦浏览器关闭,浏览器的会话Cookie
(Session
id)会消亡,但服务器中的Session
仍然存在,只有消亡倒计时结束或者调用了Session
.invalidate();服务器中的Session
才会消亡。Cookie
的安全性不高,存储在本地,总存储量也只有4kb,浏览器会限制最多Cookie
数,可能禁用Cookie
。Session
的安全性较高,总存储量很高,由于数据存储在服务器中,无需加密,但对一个网页来说具有唯一性。Cookie和Session简单应用情景.
欢迎点赞评论,指出不足,笔者由衷感谢哦!~