您的位置:首页 > 编程语言 > Java开发

Java-Web学习笔记(1) Session与Cookie

2018-03-08 21:14 316 查看
       在谈论Session与Cookie之前,我们需要先明白一个概念:“会话”。
       所谓的“会话”技术,是在Web技术中经常用到的技术,用来跟踪用户的一次完整会话。顾名思义,就像在日常生活中我们拿起电话,向他人拨打电话,当你挂断电话的时候,就代表了一次会话的结束,在现在的绝大多数浏览器中,在同一个浏览器下的不同窗口向一个网站发出请求,也视为一次会话。
       常用的会话跟踪技术,有Cookie与Session。Cookie在客户端上记录信息,Session则在服务器中保存信息。

一  Cookie
  (1)
       服务器会把用户所需要的信息(或者说是我们希望看到用户所要信息)以Cookie的形式写回给浏览器,当浏览器再次访问时,会带着保存好的Cookie去访问服务器,这样就实现了数据的保存。
       以赵四大大一张图为例:



       然而一旦浏览器禁用Cookie,这样的效果就无法取得。
       Cookie保存在本机上的位置,也因浏览器不同而已,感兴趣的同学可以谷歌或者百度一下自行查询。
(2)
       Cookie的构造函数为Cookie(String name,String value),如果有相同名称的Cookie,那么后来创建的Cookie会覆盖掉之前创建的Cookie。
       Cookie的方法有 :
       1.setMaxAge(int time) 单位是秒,作用是设定保存在客户端上的cookie的存在时间,如果不设置,默认为一次会话时间。即当你关闭时,Cookie不再存在(也与浏览器的默认设置有关)。如果想清除Cookie数据,第一要覆盖其名称,第二将其MaxAge设置为0,第三将路径设置成一样(如果你设置了路径)。
       2.setPath(String path) 作用是设置当前路径为path时,携带cookie信息,不设置时,只在请求和设置该Cookie的Servlet同路径下的资源时,会携带Cookie
          例如:
          在http://localhost:8080/day01/test/HelloServlet中通过addCookie添加cookie数据

        在访问http://localhost:8080/day01/test/test.html和http://localhost:8080/day01/test/test/test.html的                 时候都会携带cookie数据
     3.setDomain(String domain) 当你在该方法中设置 其他网站的域名时,你在本网站获得Cookie后,可以携带该Cookie去“拜访”其他网站,即第三方Cookie技术。
      4.get***  获得以上三个方法的值(***代表方法名称)
      5.getValue 获得Cookie中的数据。
(3)实例
        1.获取上次访问网页时间。
        2.购物页面跳转到购物车,携带购物信息。
二 Session
   (1) 与Cookie相对应的,Session作为服务器端为保存数据而存在的技术,将用户访问的需要的数据保存到session域之中,当用户再次访问时,服务器端会拿出数据与之对应,比如说保存用户登录状态。
            Session是四大域对象,除此之外还有servletContext与request,pageContext(说到四大域顺便提一提JSP的九大内置对象,因为我不是科班出身,听一位学长说html5最近走势越来越强,大有压过JSP的风头)。同样Session的默认存在时间为一次会话内。
            Session在服务器使用request.getSession() 语句之后创建,如果之前已经存在,那么就获得之前的Session。
            当Session的存在时间超过了其设置的时间或者当服务器关闭后,Session就会销毁。
            我们可以在web.xml文件里设置默认Session存在时间,或者使用Session相关API来设置默认时间。



    (2)getSession()的判断Session是否存在的底层实现依靠Cookie。每当我们创建一个Session的时候,会创建一个对应的sessionId,将其打入到一个Cookie中,服务器将Cookie回送给客户端保存.但是非常重要的是,这个Cookie的有效时间是一次浏览器访问进程,即Cookie保存在服务器的内存中,而不是客户端的本地磁盘中!当我们关闭浏览器之后,这个Cookie就消失了,当我们再打开浏览器时,session又会被创建。
           但是子窗口会和父窗口共享一个Session。
           现在有这么一个情况,一个用户在购物时,不小心关掉了浏览器,那么之前买的东西就都要买一次,这样做用户的体验会非常差。同时我们知道,与Session对应的Cookie是保存在服务器内存里的,那么我们可以自己创建一个与该Session对应的Cookie,其值为该Session的ID号,将其打回浏览器,并设置其存在时间不超过SESSION的存在时间,可以解决这个问题。
           如果用户连Cookie都禁用了,那么我们还可以采取URL重写办法。
   (3)例子:
            防止表单重复提交。(进入表单界面前,先由预处理程序产生一个唯一的“令牌”,再将该“令牌”存入到Session域中,由form表单EL表达式获取,再在处理表单程序中判断表单是否重复提交,在程序最后将Session中的令牌移除,这步很关键。)
            令牌发生器(单例) 将表单视为对象 由表单判断表单自身的合法性
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: