zoukankan      html  css  js  c++  java
  • JavaWeb之Servlet:Cookie 和 Session

    会话

    现实生活中我们会用手机跟对方对话,拿起手机,拨号,然后对面接听,跟着互相通话,最后会话结束。

    这个过程也可以用我们的B/S模式来描述:

     

               打开浏览器—>输入地址->发出请求->服务器收到请求->向浏览器发出响应->..重复.->关闭浏览器

     

    这样的过程我们用 “会话” 来描述,上面就一次会话的例子。

     

    会话管理

    知道会话的概念后,我们在平时上网是否可以看到一些网页有这样的操作:当你是第一次登入这个网站,网站会发出:”欢迎来到本网站”。 然而,当你第二次登入该网站,它就会发出:”欢迎再次回来”。 为什么服务器会知道我们已经登入过该页面呢?无错,就是在与服务器会话的过程中产生了一些数据,而这些数据被保存下来,服务器根据这些数据来判断你是否登陆过该页面,而输出不同欢迎标语。

     

    下面就来学习两门会话信息管理技术:

          Cookie技术会话数据保存在浏览器客户端

          Session技术:会话数据保存在服务器端。

     

    Cookie技术

    什么是Cookie技术:

    一种会话数据管理技术,该技术把会话数据保存在浏览器客户端。

     

    那么Cookie技术的原理是什么,它是如何工作的呢?

    1)首先浏览器向服务器发出请求。

    2)服务器就会根据需要生成一个Cookie对象,并且把数据保存在该对象内。

    3)然后把该Cookie对象放在响应头,一并发送回浏览器。

    4)浏览器接收服务器响应后,提出该Cookie保存在浏览器端。

    5)当下一次浏览器再次访问那个服务器,就会把这个Cookie放在请求头内一并发给服务器。

    6)服务器从请求头提取出该Cookie,判别里面的数据,然后作出相应的动作。

     

     

    Cookie的体验

     

    知道了Cookie的原理后,我们就用它来实现一些功能吧~

     

    从它的原理中,我们知道Cookie是在服务器端创建的,那么我们在Servlet中创建一个Cookie对象吧:

     

    public class cookieTest extends HttpServlet {
    
    public void doGet(HttpServletRequest request,HttpServletResponse response)
    throws ServletException, IOException {
    
            Cookie cookie = new Cookie("name", "value");
        }
    
    }

     

    Cookie的构造方法接收两个参数,第一个参数是该要传递的数据的名字,第二个是该数据的值。

    然后我们把这个Cookie加到响应头,发送给浏览器吧~

     

    Cookie cookie = new Cookie("name", "value");
            response.addCookie(cookie);

     

    这样一个Cookie就发送给浏览器了,我们在浏览器看看发过来的响应头:

     

    有一个Set-Cookie的请求头,它保存了我们设置的信息。

    然后我们用浏览器再次访问该Servlet,看看它的请求头:

     

    可以看到,浏览器会把这个Cookie信息发过去服务器。

     

    那么服务器收到这个请求后,如何得到该Cookie里的数据呢?

    我们可以这样做:

    Cookie cookie = new Cookie("name", "value");
            response.addCookie(cookie);
            
            Cookie[] cookies = request.getCookies();
            if(cookies!=null){
                for(Cookie c: cookies){
                    String name = c.getName();
                    String value = c.getValue();
                    System.out.println(name+"="+value);
                }
            }else{
                System.out.println("没有cookie信息");
            }

    调用request.getCookies()方法,返回一个Cookie数组,然后遍历它把里面的内容取出来吧!

     

     

    Cookie常用方法

     

    1)创建Cookie对象

     

    Cookie(java.lang.String name, java.lang.String value)

     

     

     

    2)设置Cookie对象

     

    setPath(java.lang.String uri)     --设置cookie的有效路径,就是指定该Cookie访问哪个资源时会传过去,访问其他资源则就不会传。

     

    setMaxAge(int expiry)             --设置cookie的有效时长,以秒为单位

     

    setValue(java.lang.String newValue)   --设置cookie的值

     

     

     

    3)发送cookie信息到浏览器

     

    response. addCookie(Cookie cookie)  

     

     

     

    4)接收浏览器发送的cookie信息

     

      Cookie[] getCookies() 

     

     

    Cookie细节

     

    1)设置cookie的有效路径: setPath(路径) 。把cookie设置到某个路径下,那么浏览器在该路径下访问服务器时就会带着cookie信息到服务器;否则,就不会带着Cooke信息到服务器。

     

     

     

    2)设置cookie的有效时长: setMaxAge(整数)。

     

    正整数: 表示cookie数据保存在浏览器的缓存区中(硬盘中),以秒为单位。例如,10: cookie10秒之后失效!

     

    负整数: 表示cookie数据保存在浏览器的内存区中。关闭浏览器cookie就会失效!

     

    零: 表示删除同名的cookie数据

     

     

     

    3)设置cookie的值: setValue()

     

     

     

    4cookie保存的会话数据类型必须是字符串的。浏览器一般只允许存放300Cookie,每个站点最多存放20Cookie,每个Cookie的大小限制为4KB

     

     

     

    5cookie不适合保存敏感数据(例如密码)

     

     

     Session技术

     

    什么是Session技术:

     

    一种会话数据管理技术,该技术把会话数据保存在服务器端。

     

    同样都是会话数据管理技术,为什么我们要发明Session技术呢?

     

     

    我们先分析一下Cookie的局限性:

     

            1Cookie数据类型都是String,且容量有限制的。

     

            2Cookie不适合保存敏感数据

     

     

     

    所以,Session技术可以解决这两种情况。

     

     

     

     

     

    那么Session技术的原理是什么,它是如何工作的呢?

     

    1)浏览器发出请求到服务器。

     

    2)服务器会根据需求生成Session对象,并且给这个Session对象一个编号,一个编号对应一个Session对象

     

    3)服务器把需要记录的数据封装到这个Session对象里,然后把这个Session对象保存下来。

     

    4)服务器把这个Session对象的编号放到一个Cookie里,随着响应发送给浏览器

     

    5)浏览器接收到这个cookie就会保存下来

     

    6)当下一次浏览器再次请求该服务器服务,就会发送该Cookie

     

    7)服务器得到这个Cookie,取出它的内容,它的内容就是一个Session的编号!!!

     

    8)凭借这个Session编号找到对应的Session对象,然后利用该Session对象把保存的数据取出来!

     

     

     Session的体验

    下一面我们就在Servlet内创建一个Session吧:

    public class sessionTest extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            
            HttpSession session = request.getSession();
            session.setAttribute("name", "Rime");
        }
    }

    这样当浏览器请求这个Servlet服务时,就会把这个session发过去啦~,我们来看看服务器收到的响应头吧!

    可以看到服务器给浏览器发出了一个 Set-Cookie 的响应头,里面有一个JSESSIONID!没错,这个就是Session的编号了!

    然后我们再次访问这个Servlet吧!

    浏览器会把保存这个JSESSIONID的cookie发送过去服务器~那么服务器接收这个session编号,然后取出这个编号对应的数据吧!!

        //得到数据
            String name = (String)session.getAttribute("name");
            
            System.out.println("name="+name);

    然后看到输出结果:

    name=Rime

    这样就服务器就可以根据这个name的值来根据需要做出一些动作了~

     SessionAPI

    学习HttpSession

     

    1)创建/得到HttpSession对象

        HttpSession request.getSession()  

        HttpSession request.getSession(boolean create)  

    2HttpSession作为域对象保存会话数据

        void setAttribute(java.lang.String name, java.lang.Object value)  保存数据

        java.lang.Object getAttribute(java.lang.String name)     得到数据

        void removeAttribute(java.lang.String name)  清除数据

    3session细节:

        java.lang.String getId()  得到session对象的编号

        void setMaxInactiveInterval(int interval)   设置session对象的有效时长

        void invalidate()      销毁session对象

     

     

    Session细节

     

    1)得到session编号: getId() 

     

     

    2session对象生命周期:

     

      2.1 session对象什么创建? 

     

          执行request.getSession()方法时

     

      2.2 session对象什么销毁?

     

          1)默认情况下,session对象在30分钟之后服务器自动销毁。

     

          2)手动设置session有效时长

     

          void setMaxInactiveInterval(int interval) -以秒为单位。

     

    3)配置session的有效时长(统一配置)

     

    4)手动销毁

     

          void invalidate()

     

    3getSession方法的使用

     

          getSession(true) / getSession() : 创建或得到session对象。如果得不到session对象,创建 新的session对象。主要是用于创建session对象的。

     

          getSession(false)     :得到session对象。如果得不到session对象,返回null。主要用于判断是否可以得到session对象的。

     

    4session编号的cookie过期时间:

     

          默认情况下,cookie是在浏览器关闭时失效!!!

     

          修改cookie的有效时长:

     

          setMaxAge(正整数);

     

     

     

     

     

     

     

  • 相关阅读:
    初窥语义搜索
    爬取菜谱网站
    paramiko简介
    软件项目结构规范
    paramiko 远程执行多个命令
    python 中in 的 用法
    spring依赖(部分)
    ModelAndView的部分回顾
    SringMVC 国际化
    spring事物配置,声明式事务管理和基于@Transactional注解的使用
  • 原文地址:https://www.cnblogs.com/vmax-tam/p/4130589.html
Copyright © 2011-2022 走看看