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(正整数);

     

     

     

     

     

     

     

  • 相关阅读:
    显示文件本地文件夹
    Select Dependencies选择依赖项
    搜索小技巧
    783. Minimum Distance Between BST Nodes BST节点之间的最小距离
    5. Longest Palindromic Substring 最长的回文子串
    12. Integer to Roman 整数转罗马数字
    3. Longest Substring Without Repeating Characters 最长的子串不重复字符
    539. Minimum Time Difference 最小时差
    43. Multiply Strings 字符串相乘
    445. Add Two Numbers II 两个数字相加2
  • 原文地址:https://www.cnblogs.com/vmax-tam/p/4130589.html
Copyright © 2011-2022 走看看