彻底了解Cookie和Session的区别(面试)_session和cookie的区别-CSDN博客
会话:从客户端开始访问访问服务器,最终到客户端关闭与服务器之间数据交互,在这个过程中,可能存在若干个请求与响应.这些操作称为一次完整的客户端与服务器之间的一次会话.
web程序使用HTTP协议传输.而HTTP协议是无状态的协议,对于事务处理没有记忆能力.这样就导致对于事务后续的处理需要再传一次信息,会使每次传输的数据量增大. 使用会话技术可以解决该问题.
Cookie技术
- 在第一次登录后服务器返回一些数据(Cookie)给浏览器然后保存在本地,当该用户再次发送请求时,就会自动把上次请求存储的Cookie数据自动携带给服务器,服务器通过浏览器携带的数据就知道当前用户是谁了.
- Cookie存储的数据量优先,不同的浏览器有不同的存储大小.但是一般不超过4KB.所有Cookie只能存储小量的数据.
Cookie的操作
// 创建Cookie
Cookie cookie = new Cookie("username","zhangsan");
// 通过response响应给客户端
resp.addCookie(cookie);
resp.getWriter().write("aaaaaaaaaaaaaaaaa");
Cookie的分类:
临时Cookie:它仅存在于浏览器会话期间,如果浏览器关闭了,Cookie消失.
持久Cookie:手动给Cookie设置过期时间,这样即使浏览器关闭了,Cookie仍然存在,除非过期时间到了,才会失效.
// 创建Cookie
Cookie cookie = new Cookie("username","zhangsan");
// 设置过期时间 单位为秒
cookie.setMaxAge(60*60*24);
// 设置cookie的域名
cookie.setDomain("localhost");
// 设置cookie的路径
cookie.setPath("/");
// 通过response响应给客户端
resp.addCookie(cookie);
获取Cookie
通过req.getCookies() 方法获取Cookie.
@WebServlet("/cookie1")
public class CookieDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("接收到请求......");
// 获取cookie
Cookie[] cookies = req.getCookies();
if(cookies !=null ){
// 遍历数组,找出自己的cookie
for (Cookie cookie : cookies) {
// 遍历出来的cookie之后,需要根据cookie的名称进行判断
if("username".equals(cookie.getName())){
System.out.println("cookie的值为:" + cookie.getValue());
}
}
}
}
}
Cookie的不足
- 数量受到限制. 一个浏览器最多创建300个Cookie,并且每一个不能超过4KB,每一个Web站点能设置的Cookie总数不能超过20个.
- 安全性不能保障: 在受到跨站点脚本攻击时,脚本指令将会读取当前站点的所有Cookie 内容(已不存在 Cookie 作用域限制),然后通过某种方式将 Cookie 内容提交到指定的服务器(如:AJAX)。一旦 Cookie 落入攻击者手中,它将会重现其价值。
- 浏览器可以禁用Cookie
Session技术
session也是会话技术,它是基于Web服务器的一个会话技术.数据存储在服务器内部.基于本次客户端开始访问服务器,一直到访问结束,服务器内部会创建针对当前这个客户端一个唯一的session对象,存储在这一个系列操作中的关键性数据.
session的生命周期
session产生时间
- 当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。
- 这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。
- 服务器同时也把sessionID和对应的用户信息、用户操作记录在服务器上,这些记录就是session。再次访问时会带入会发送cookie给服务器,其中就包含sessionID。
- 服务器从cookie里找到sessionID,再根据sessionID找到以前记录的用户信息就可以知道他之前操控些、访问过哪里。
销毁时间:
客户端默认事件持续30分钟内,都没有与服务器有任何交互.这是session默认事件到,服务器会自动销毁.
- 在Tomcat的管理页面上,可以配置某个项目的全局session过期时间
- 在项目的核心配置文件web.xml中配置session的过期时间
<web-app>
<session-config>
<session-timeout>1</session-timeout>
</session-config>
</web-app>
通过session中的方法设置过期时间
session.setMaxInactiveInterval(120);
调用session的销毁方法:
//销毁session
session.invalidate();
不正常的关闭服务器,session随着Tomcat服务器的关闭会销毁.
正常关闭服务器.Tomcat会将当前内存中的所有session通过io对象(对象序列化技术) 存储在Tomcat的Work目录下,下次启动Tomcat的时候,会进行反序列化,然后将其加载回来.(session的活化和钝化)
获取session对象
调用getSession(boolean create)方法:
- 如果传递的boolean值是true,session存在,直接返回session,session不存在会创建session并返回session.
- 如果传递的boolean值为false,这时session不存在,返回null,session存储,直接返回session对象
@WebServlet("/session")
public class SessionDemo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// session是由服务器维护,而且session是由服务器创建,我们在程序中只能获取,无法创建
/**
* 在Servlet或者jsp文件中,调用getSession()方法:
* 1、先根据客户端获取Session,如果服务器内部并没有基于这个客户端的Session对象
* 这时服务器会针对这个客户端创建一个session对象,并返回
* 2、如果在获取session的时候,基于这个客户端的session已经存在,这时只会返回这个session不会创建
*/
HttpSession session = req.getSession();
System.out.println(session);
}
}
session作为域对象
session作为一个容器,可以在客户端一系列的操作过程中存储一些共享的数据.
在任何的一个servlet或者jsp页面基于当前这个客户端获取的session中存储数据,在其他的servlet或者jsp中.可以直接回去数据.
- setAttribute(String name,Object value):给session中存储数据.
- getAttribute(String name):获取当前指定的name对应的值,如果不存在返回null
- removeAttribute(String name):根据指定的name ,从session删除name和对应的value
JSESSIONID
服务器识别客户端的session对象依赖的是:服务器在创建session对象的时候,给每个session绑定了一个唯一的jsessionid的字符串数据.
在客户端访问到服务器之后,服务器内部创建出session,而且在服务器内部给客户端响应数据的时候,将jsessionid作为Cookie的数据一起发送给客户端.
后续客户端访问的时候,会携带jsessionid,服务器通过jsessionid就可以找到当前这个客户端的session对象.
注:如果浏览器将cookie禁用了,导致每次访问服务器,即使session存在,服务器也无法找到对应的session对象。因为客户端请求的时候不会携带jsessionid。