session和cookie区别

 Session

 

用于记录用户的登录与行为数据,即用户目前访问服务器上的哪些内容,状态是什么(这些数据没有必要直接存储在数据库中)。

用户刷新页面(即再次访问服务器的时候),可以根据session,直接显示用户刚刚访问时的网页状态(比如翻页在哪里,输入了什么内容等等),为用户提供了更优体验。

用户的session信息非常关键,它记录了用户进入页面、查看结果、点击结果、以及一些后续操作,通过session可以把用户的行为联系起来。

  

  • session是由服务器创建的
    • 当浏览器第一次访问服务器时,服务器会自动生成一个Session ID并将其通过响应发送到浏览器。(存放在cookie中,key为JSSIONID,value为Session ID的值)
    • 浏览器第二次发送请求会将前一次服务器响应中的Session ID放在请求中一并发送到服务器上,服务器从请求中提取出Session ID,并和保存的所有Session ID进行对比,找到这个用户对应的Session,并返还给请求者(Servlet)使用。

(如果该session已经被销毁,那么服务器会创建一个新的session返还给浏览器)

    • 每个用户都会产生一个session。(如果并发访问很多,会很消耗服务器性能)

 

  • session对象的生命周期
    • 创建:第一次执行request.getSession()时创建
    • 销毁:
      • 1)服务器(非正常)关闭时
      • 2)session过期/失效(默认30分钟
可以在工程的web.xml中进行配置
<session-config>
    <session-timeout>30</session-timeout>
</session-config>
      • 3)手动销毁session  session.invalidate(); 

 

Cookie

  • cookie是存储在客户端的

  • cookie有大小限制以及浏览器在存cookie的个数也有限制

session是没有大小限制和服务器的内存大小有关。但当访问增多,会比较占用服务器的性能。

  • cookie的生命周期
    • 不进行额外设置,cookie生命周期就是浏览器的会话周期,当关闭浏览器,cookie就消失。这个cookie成为会话cookie,存储在浏览器的内存中。
    • 设置了过期时间,cookie会存储在硬盘上,直至过期。

 

1. 获取session对象

HttpSession session = request.getSession();

getSession()/getSession(true)、getSession(false)的区别

getSession()/getSession(true):当session存在时返回该session否则新建一个session并返回该对象

getSession(false):当session存在时该session,否则不会新建session,返回null

 

2. 怎样向session中存取数据

session.setAttribute(String name,Object obj);

session.getAttribute(String name);

session.removeAttribute(String name);

 

3. 服务器端向客户端发送一个Cookie

1)创建Cookie:

Cookie cookie = new Cookie(String cookieName,String cookieValue);

示例:

Cookie cookie = new Cookie("username","zhangsan");

那么该cookie会以响应头的形式发送给客户端:

注意:Cookie中不能存储中文

2)设置Cookie在客户端的持久化时间:

cookie.setMaxAge(int seconds); ---时间秒

注意:

如果不设置持久化时间,cookie会存储在浏览器的内存中,浏览器关闭cookie信息销毁(会话级别的cookie),

如果设置持久化时间,cookie信息会被持久化到浏览器的磁盘文件

3)设置Cookie的携带路径:

cookie.setPath(String path);

注意:如果不设置携带路径,那么该cookie信息会在访问产生该cookie的web资源所在的路径都携带cookie信息

示例:

cookie.setPath("/WEB16");

代表访问WEB16应用中的任何资源都携带cookie

cookie.setPath("/WEB16/cookieServlet");

代表访问WEB16中的cookieServlet时才携带cookie信息 

4)向客户端发送cookie:

response.addCookie(Cookie cookie);

5)删除客户端的cookie:

  如果想删除客户端的已经存储的cookie信息,那么就使用同名同路径的持久化时间为0的cookie进行覆盖即可

 

4.服务器端怎么接受客户端携带的Cookie

cookie信息是以请求头的方式发送到服务器端的:

1)通过request获得所有的Cookie:

Cookie[] cookies = request.getCookies();

2)遍历Cookie数组,通过Cookie的名称获得我们想要的Cookie

for(Cookie cookie : cookies){

  if(cookie.getName().equal(cookieName)){

    String cookieValue = cookie.getValue();

  }

}

 

 详细参照:https://blog.csdn.net/weixin_40521823/article/details/79837162?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-4&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-4

posted on 2020-04-20 15:50  青柠锦鲤  阅读(325)  评论(0编辑  收藏  举报