博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
会话技术Cookie和Session
阅读量:6655 次
发布时间:2019-06-25

本文共 3824 字,大约阅读时间需要 12 分钟。

一、什么是会话技术 
  1. 会话:打开一个站点开始 到你关闭这个站点的整个过程 叫做一次会话
  2. 为什么要学习会话技术?
    因为http协议是无状态 要通过会话技术保持用户的状态和信息
  3. 两种会话技术:Cookie   Session
    1. Cookie技术
      是把数据存储到客户端 下次在访问网站的时候 将这个数据一起携带过去,数据都存放在客户端 相对不安全  服务端压力相对小一些
    2. Session技术
      是把数据存储在服务器端 ,数据相对安全一点 但是服务压力大
二、Cookie技术
  1.     常用API
    1. 新建一个Cookie:
       
      1. Cookie cookie = new Cookie(name,value)
    2. 回写客户端:
       
      1. response.addCookie(cookie);
    3. 获取cookie: 
       
      1. Cookie[] cookies = request.getCookies();
      2. cookie.getName();//获取cookie里name的值
      3. cookie.getValue();//获取cookie的值
    4. 持久化时间:
       
      1. cookie.setMaxAge(second);
    5. cookie的携带路径:
       
      1. cookie.setPath("/wen应用名/具体页面);
    6. 访问哪个域名携带(设置第三方cookie)
       
      1. cookie:cookie.setDomian(.baidu.com);
      2. //()内些具体的域名,以.开始
    7. cookie的创建和获取的案例
       
      1. // 设置一个访问时间的timercookie
      2. response.setContentType("text/html;charset=UTF-8");
      3. PrintWriter writer = response.getWriter();
      4. SimpleDateFormat simp = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
      5. Date d = new Date();
      6. String timer = simp.format(d);
      7. Cookie cookie = new Cookie("timer", timer);
      8. response.addCookie(cookie);
      9. // 取出cookie的数据
      10. Cookie[] c = request.getCookies();
      11. //判断是否是第一次访问
      12. boolean flag = true;
      13. if (c != null)
      14. {
      15. for (Cookie cookie1 : c)
      16. {
      17. //判断cooke的name值是否与需要的一样
      18. if ("timer".equals(cookie1.getName()))
      19. {
      20. //获取cookie的对应的值
      21. String value = cookie1.getValue();
      22. //向页面写出数据
      23. writer.write("你上次访问的时间是" + value);
      24. flag = false;
      25. }
      26. }
      27. }
      28. //判断是否是第一次访问页面
      29. if (flag)
      30. {
      31. writer.write("欢迎访问本网站");
      32. }
  2. cookieAPI细节:
    1. 会话级别的cookie和持久级别的cookie?
      会话级别的cookie存储在浏览器的缓存中 浏览器一关闭 缓存清除 cookie一起清除掉了
      持久级别的cookie 持久化到浏览器在磁盘的目录  不同的浏览器目录不一样
      cook.setMaxAge(秒);              //网页缓存相关头 expires
      注意:setMaxAge的参数时间 设置0 代表删除相应的cookie
    2. cookie的携带路径?cookie.setPath()
      如果没有显示设置cookie的携带路径的话 默认访问这个web应用的所有的资源都携带cookie,前提是访问过具有创建设置cookie对象能力的页面之后。如果将cookie的path设置成“/”那么在访问服务器中的所有web应用都会携带ccokie(访问webApps下的所有应用都会携带cookie),同样也需要访问过具有创建设置cookie对象能力的页面之后。如果设置了cookie.setPath()具体值之后,在访问带有创建设置cookie页面之后,再去访问其他页面,不会带有cookie值,之后再次访问该页才会有。
      注意:如果某一个cookie设置了path 要想删除这个cookie 除了设置setMaxAge(0) 还需需要把path路径设置成一样
      设置cookie
       
      1. Cookie cookie = new Cookie("name","xiaohua");
      2. cookie.setPath("/");
      3. response.addCookie(cookie);
      删除cookie
       
      1. Cookie [] cookies=request.getCookies();
      2. if(cookies!=null)
      3. {
      4. for(Cookie c:cookies)
      5. {
      6. if("name".equals(c.getName()))
      7. {
      8. c.setMaxAge(0);
      9. //如果这个的这个setpath没有写就不会删除成功
      10. c.setPath("/");
      11. response.addCookie(c);
      12. }
      13. }
      14. }
      注意:创建cookie和删除cookie可以不再一个页面,但是如果设置了setpath或者Domian那么删除的时候也需要进行设置,其原因是因为cookie在请求头中只携带name和value,并不携带其他信息,所以删除的时候要进行信息的补齐。
    3. 设置第三方cookie?
      cookie.setDomain();  //设置cookie在访问哪个域名时携带cookie
      什么是第一方cookie和第三方cookie?
      第一方cookie:  访问百度    cookie.setDomain(".baidu.com");
      第三方cookie:  访问百度    cookie.setDomain(".jd.com");
三、Session
技术
  1. HttpSession对象是Servlet的三大域对象之一,其他两个域对象是HttpServletRequest和ServletContext。这三个域中,request的域范围最小,它的域范围是整个请求链,并且只在请求转发和包含时存在;session域对象的域范围是一次会话,而在一次会话中会产生多次请求,因此session的域范围要比request大;application的域范围是最大的,因为一个web应用只有唯一的一个application对象,只有当web应用被移出服务器或服务器关闭它才死亡,它的域范围是整个应用。
  2. 常用API
    1. 获取Session对象:
       
      1. Session session=request.getSession();
    2. 向域中添加域属性;
       
      1. session.setAttribute(String name,Object value)
    3. 从域中获取指定名称的属性值; 
       
      1. session.setAttribute(String name,Object value)
    4. 移出域中指定名称的域属性     
       
      1. session.removeAttribute(String name):    
  3. request.getSession();的内部实现是怎样的? 
    当调用getSession方法时 会首先去服务器的内存中找一下是否有这个用户的session 如果有直接返回 如果没有,创建session对象在返回。
    session其实是借助cookie  session的编号JSESSIONID
    注意:客户端阻止写cookie session就不能用 JSSESSIONID
  4. session的生命周期:
    1. 何时创建:第一次掉request.getSession();
    2. 何时销毁:
      (1)服务器关闭。
      (2)手动调用销毁session的方法 session.invalidate();
      (3)session在30分钟不使用就自动销毁(Tomcat的web.xml中) 
      问题:浏览器关闭后响应session销毁?  错,session对象和本地客户端没有关系
  5. 修改session默认的销毁时间
    在自己web应用中web.xml,不要修改tomcat的全局的xml
  6. Url重写()
    由于sessio对象能够知道是谁在访问,是通过获得用户本地cookie的JSSESSIONID,它代表了session的编号。
    如何客户端阻止写cookie session,就不能使用JSSESSIONID。
    解决方法:response.encodeURL(url);
     
    1. HttpSession session = request.getSession();
    2. PrintWriter writer = response.getWriter();
    3. String path = "/android_web09/showBookList";
    4. path = response.encodeURL(path);
    5. writer.write("<a href=\""+path+"\">访问图书商城首页</a>");

转载于:https://www.cnblogs.com/didixyy/p/61e62421a5571233cd0e8de057092c88.html

你可能感兴趣的文章
httpd服务的简单配置
查看>>
系统管理员权限的用户过多
查看>>
Netty高性能之道
查看>>
我的友情链接
查看>>
SUSE下nx nomachine安装配置
查看>>
精通脚本***学习笔记(二)
查看>>
我的友情链接
查看>>
shell数组常见操作
查看>>
远程桌面被远程的机器就死机解决方案
查看>>
我的友情链接
查看>>
typedef用法
查看>>
oracle基本操作语句(初学者语句)
查看>>
第四章 INI配置——《跟我学Shiro》
查看>>
【Android必备】应用小部件概述(23)
查看>>
【Interface&navigation】材料设计(20)
查看>>
我要学python之生成器
查看>>
Caused by: org.hibernate.TransientObjectException: object references an unsaved
查看>>
ubuntu 13.04 安装QQ
查看>>
IOS图片的拉伸技巧
查看>>
tomcat安装
查看>>