servlet中的Cookie和Session
1.Cookie
-
从打开浏览器,然后浏览一些网页 ,最后关闭浏览器 的过程这叫做一个会话
-
做到有状态
-----会用到我们的cookie和session技术
-
Cookie是驻留在客户端(浏览器)的一个文本文件;可以在浏览器的缓存目录中找到
-
Cookie作用:在客户端保存用户相关的简单信息(如果需要将一个文本文件保留在浏览器/客户端)
-
浏览器的缓存:浏览器会把某些我们访问过的页面或者文件保存在本地,这个文件就叫缓存。
Cookie也是一个缓存
- 缓存清除了,cookie也就不在了
- 如果浏览器清除了缓存,则cookie文件就删除了
创建Cookie的格式
Cookie cookie=new Cookie(“key”,“value”);
set/getName() //获取key
set/getValue()
set/getMaxAge() 失效时间 单位秒
浏览器会自动将Cookie传递过来
案例代码展示:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//浏览器提交请求会自动把Cookie传递到我们的服务器
//获取Cookie
Cookie[] cooks = request.getCookies();
for (Cookie cookie : cooks) {
System.out.println(cookie.getName() +" "+URLDecoder.decode(cookie.getValue(),"utf-8"));
}
//Cookie是一个键值对
Cookie c= new Cookie("name","aaa");
//设置保存时间 (默认的保留时间是一个会话)
c.setMaxAge(3600);//时间单位为int,表示秒 ,时间单位为long,表示毫秒
//--只是创建cookie,还需要通过response的addCookie添加到客户端
response.addCookie(c);
//Cookie不支持直接保存中文,如果要存中文,创建cookie时需要对它进行编码,获取cookie时需要对它解码
//对字符串进行编码 URLEncoder.encoder(s);
//对字符串进行解码 URLDecoder.decoder(s);
}
//创建Cookie:
//Cookie是一个键值对
Cookie c = new Cookie(“name”, URLEncoder.encode(“中文”,“utf-8”));
//设置保存时间 (默认的保留时间是一个会话)
c.setMaxAge(3600);//时间单位为int,表示秒 ,时间单位为long,表示毫秒
//–只是创建cookie,还需要通过response的addCookie添加到客户端
response.addCookie©;
//Cookie不支持直接保存中文,如果要存中文,创建cookie时需要对它进行编码,获取cookie时需要对它解码
//对字符串进行编码 URLEncoder.encoder(s);
//对字符串进行解码 URLDecoder.decoder(s);
2.session
Session是服务器端端一块存储空间,类似于一个map结构。(键值对)
作用:可以用来保留一些用户的登录信息。(放用户名,用户id)
如何获得session:
过程:
(1)浏览器—>服务器:当我们第一次访问某个servlet的时候,服务器会生成一个叫做JSESSIONID的id
(2)生成id以后,response.addCookie()添加到浏览器
(3)浏览器就会有一个叫做JSESSIONID的cookie
以后每次访问,浏览器会自动携带这个id
每次会话的id是不一样的,服务器就能区分是谁在访问了
ServletContext 可以存放一些项目的公用信息
有的时候需要存信息,一般情况用时间短的,request
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//每次创建一个新的setlvet 需要重启一下服务器
//session 是服务器端的一块存储空间 是一个map结构
//作用是 保存用户登录信息
//获取session对象 request.getSession()
HttpSession session= request.getSession();
//设置值
session.setAttribute("name", "gok");
session.setAttribute("UserInf", "gok1");
//和获取值
System.out.println(session.getAttribute("name"));
//移除属性
session.removeAttribute("name");
//销毁session 这个对象就没了
//【默认session生命周期是30分钟 这个时间是可以改的 在web.xml 】
// <session-config>
// <session-timeout>100</session-timeout>
// </session-config>
//销毁session
// session.invalidate();
response.getWriter().println("中文1111但是撒多撒");
}
cookie和session的理解
1.必须要知道的几点
-
①cookie和session功能就是存储数据。cookie存储形式更单一 :
以键值对(key:value)的形式存储。session则没有固定的结构(可以文件实现,数据库实现,等等)。通常也可以是键值对。 -
②cookie和session两者存在的位置不同,cookie是在浏览器内的。而session存在于服务器上。
-
③在你访问百度时,浏览器会把属于www.baidu.com这个网站的cookie,放在http数据包中带给服务器。
-
④cookie和session都有有效时间,每次的使用会加满有效时间,长期不使用就过期咯。
2.cookie和session常用于把http协议变得“有状态”
①HTTP协议无状态的意思,例如,A用户访问网页,向服务器发送请求A。B用户访问网页,向服务器发送请求B。服务器并不能知道A请求和B请求分别是谁发出来的。(服务员也是这样,一天服务那么多人,服务完之后,哪还记得你是谁)
②怎么让服务器认识你呢?有下列的方式。
-
Ⅰ.cookie不是会带给服务器么。那我把我的支付宝账号和密码存储在Cookie里面,然后带给服务器,服务器不就认识我了么?是的,是会认识你。这样黑客也会想认识你,cookie本身是不安全的。所以,账号密码存储在cookie中显然不是明智的做法,黑客很容易从你的浏览器中盗取到你的cookie。
-
Ⅱ.账号密码存在cookie不安全,那我登陆的时候把账号密码发给服务器,然后,服务器把账号密码存到session的一个房间里,然后把唯一的房间号码发回给我,我把这个房间号(房间号也就是常说的session_id或者session_key)放在cookie中。是不是服务器能通过这个房间号找到我的账号和密码呢?是的,这样做到了账号密码没有存储在浏览器上,做到了信息存储安全。那黑客要是也拿着我的房间号找服务器怎么办呢。
-
Ⅲ.cookie的过期时间,能在一定程度上提高安全度。因为,解密也是需要时间的。当然也可能还不够安全。(至少长期看来是这样)
-
Ⅳ.当然有更安全的方式 : csrf-token。这个不是本文重点,想了解自行百度。(没有绝对的安全)
③当然cookie和session也可以用来存储其他的数据,不仅仅是账号密码。