Cookie和Session的实现及底层原理
Cookie
简要介绍一下,Cookie的底层原理,以及基本使用,方便以后查阅
参考博客:https://blog.csdn.net/Mr_wxc/article/details/102636559
参考博客:
https://blog.csdn.net/weixin_41547486/article/details/81294250
Cookie的底层实现原理
- 由服务器创建Cookie对象
new Cookie("name","value");
- 服务器将创建的cookie对象响应给浏览器
response.addCookie(cookie);
- 浏览器从响应头中获得cookie,以后每次请求服务器时浏览器都会在请求头中携带cookie
Cookie的保存位置
cookie由服务器创建,保存在浏览器中
服务器怎样获得cookie
Cookie[] cookies = request.getCookies();//获得浏览器中的所有cookie
String userpassVal = null;
//遍历cookies
for (Cookie cookie : cookies) {
//获取cookie的name
String cookieName = cookie.getName();
if("userpass".equals(cookieName)){
//获得Base64编码后的字符串
userpassVal = cookie.getValue();
System.out.println(userpassVal);
//解码用URLDecoder.decode
userpassVal = URLDecoder.decode(userpassVal,"UTF-8");
System.out.println(userpassVal);
}
}
Cookie知识点
- cookie的默认存活时间是浏览器关闭(即浏览器关闭后cookie就失效)
- 设置cookie的存活时间
setMaxAge(int expiry)
1、正整数:表示保存的时间,以秒为单位
2、负整数:表示浏览器关闭cookie就失效了
3、零:表示删除同名的cookie数据
- cookie数据类型只能保存非中文字符串类型
cookie中是不可以保存中文的,但可以使用URLEncoder.encode()方法编码后再存放到cookie中。获得cookie时,使用URLEncoder.decode()方法解码就可以了
URLEncoder.encode(“name”,“UTF-8”);
URLEncoder.decode(“name”,“UTF-8”);
- 可以保存多个cookie,但是浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB
- Cookie的不可跨域名性
Session
Session的底层原理实现
通过Cookie的实现
客户端第一次访问Session的时候,会在服务器端生成一个Session对象并生成一个唯一标识JSessionId,服务器端会将JSessionID存放在Cookie中响应给客户端,客户端之后的每一次请求都会JSessionID,服务器端从Cookie中获得JSessionID,去查找对应的session对象,如果没有查找到就会创建一个新的session对象,查找到就可以进行后续操作
通过URL重写来实现
当客户端的cookie被禁用时,想要使用session就必须通过URL重写的方式
如何重写URL:通过response.encodeURL()方法
encodeURL()的两个作用
- 第一个作用:转码(说明:转中文的编码,或者一些其他特殊的编码。就好比如网页的链接中存在中文字符,就会转换成为一些百分号或者其他的符号代替。)
- 第二个作用:URL后面加入sessionID,当不支持cookie的时候,可以使用encodeURL()方法,encodeUTL()后面跟上sessionID,这样的话,在禁用cookie的浏览器中同时也可以使用session了。但是需要自己编程,只要链接支持,想用session就必须加上encodeURL()。
提示:若想程序中永远支持session,那就必须加上encodeURL(),当别人禁用了cookie,一样可以使用session。
简单的代码例子:在没有使用encodeURL()方法前的代码
out.println("<br><a href=" + "SessionInfoServlet" + ">refresh</a>");
在使用encodeURL()方法后的代码
out.println("<br><a href=" + response.encodeURL("SessionInfoServlet") + ">refresh</a>");
Session参考博客:https://blog.csdn.net/weixin_42217767/article/details/92760353
博主的版权声明:本文为CSDN博主「广小白」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42217767/article/details/92760353