zoukankan      html  css  js  c++  java
  • 理解会话中的Cookie和Session对象

    会话可以简单理解为:用户打开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。

    在java语言中,Servlet程序是由WEB服务器调用,web服务器收到客户端的Servlet访问请求,其中这个过程,保存会话中数据的两种重要技术:

    1.Cookie技术:

    Cookie是客户端技术,服务器把每个用户的数据以cookie的形式写给用户各自的浏览器,并保存在客户端浏览器的缓存中。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。

    2.Session技术:

    Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。

    一.HttpSession原理

    Cookie和Session都能维护web客户端和web服务端的会话。

    1.  什么是HttpSession

       1)  HttpSession属于服务端技术;

       2)  在Servlet中,产生唯一的会话,必须通过request.getSession()才行,重新打开新的IE,会产生新的Session会话;

       3)  在转发和重定向的情况下,多个Servlet中共享同一个HttpSession;

       4)  同一个代码request.getSession(),但可能含义不同,其一是代表创建新的会话,其二是取得原有的会话;

    2.  HttpSession原理

       1)  会话底层是基于Cookie的;

       2)  客户端发送请求头:Cookie: JSESSIONID=99152C7F1862952395B8D8EC99089E2E

       3)  服务端发送响应头:Set-Cookie: JSESSIONID=99152C7F1862952395B8D8EC99089E2E; Path=/day08

    因此,对于会话而言,通过JSESSIONID来维护客户端和服务端的状态;

       4)  通过手工向客户端写入Cookie来达到多个浏览器共享会话的情况;

       5)  确保浏览器能禁止Cookie成功,当Cookie被禁用,可以使用URL重写来维护客户端和服务端的状态;

       6)  会话在服务端默认有效期为30分钟;

       7)  如果有这样的错误:Session already invalidated:

    则表示在无效的会话中取值,此时会话并没有销毁,只是内容被清空而已;

       8)  当浏览器阻止Cookie写入浏览器,可以使用URL重写;

    二.HttpSession如何销毁

    1. 在web.xml文件中配置过期时间,单位为分,Cookie生命周期时间单位是:秒;
    <web-app version="2.5" 
        xmlns="http://java.sun.com/xml/ns/javaee" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
        http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
      <session-config>
        <session-timeout>1</session-timeout>
      </session-config>
    </web-app>

        2.   通过HttpSession.invalidate()将当前会话设置为无效;

        3.   web服务器shutdown时,即销毁HttpSession;

        4.   重新部署新的web应用。

       注意:关闭浏览器,在默认情况下,会话不会销毁。

    三.Cookie细节

    1. 一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(Nme)和设置值(Value);
    2. 一个web站点可以给一个web浏览器发送多个Cookie,一个web浏览器也可以存储多个web站点提供的Cookie;
    3. 浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB;
    4. 如果创建了一个Cookie,并将他发送到浏览器,默认情况下它是一个会话级别的Cookie,即存放在浏览器的缓存中,而当用户退出浏览器后被删除。

       注意:删除Cookie时,path必须一致,否则不会删除。

    四.HttpSession细节

    1.ssion对象被销毁之后,不能在会话中取其内容

        代码:

          session.invalidate();

    //session.getAttribute("")此操作无效,不允许

    五.乱码问题

    1. 在Servlet中,以字节方式输出给浏览器时:

    ServletOutputStream以本地平台方法自动编码和解码,以解决中文输出问题,即用户不需要设置编码方法,ServletOutputStream已解决。

    代码如下:

    public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            ServletOutputStream sout = response.getOutputStream();
            sout.write("你好!".getBytes());

    或者,用户可以自定义编码和解码方式,也可以解决中文输出问题。

    代码如下:

    public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            response.setCharacterEncoding("UTF-8");
            response.setContentType("text/html;charset=UTF-8");
            ServletOutputStream sout = response.getOutputStream();
            sout.write("大家好!".getBytes("UTF-8"));    }

           2.   在Servlet中,以字符方式输出给浏览器时:需要在Servlet代码中设置服务端的编码方式和客户端的编码方式一致。

    代码如下:

    public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            //以字符方式输出中文
            response.setContentType("text/html;charset=utf-8");
            PrintWriter pw = response.getWriter();
            pw.write("你好!大家好!");
        }

    六.什么样的场景下选用不同的域对象

    1. 在多个动态web资源中共享信息时,想到使用域对象;
    2. Context:信息是属于每个客户端共享的,例如访问次序;
    3. Session:信息是属于每个客户端独享的,例如购物车,用户登录;
    4. request:信息是属于一次性的内容,例如错误信息,项目中优先使用; 

    七.Get 和 Post 请求时的转发和重定向

    1. 转发问题:

         1)  在doGet()方法下进行转发时,则转发到的页面代码是doGet()方法下执行的代码;

         2)  在doPost()方法下进行转发时,则转发到的页面代码是doPost()方法下执行的代码;

         2.   重定向问题:

        1)  在doGet()方法下进行重定向时,则重定向到的页面代码是doGet()方法下执行的代码,因为重定向后是由客户端浏览器从新以request()的Get请求头方式请求;

    八.会话对象常用的AIP

    1. Cookie对象
    Cookie cookie = new Cookie("name","xiaoming");
            System.out.println(cookie.getName());//输出name
            System.out.println(cookie.getValue());//输出name对应的值,即xiaoming
            cookie.setMaxAge(60);//设定这个cookie的最长存活时期,单位:秒
            int time = cookie.getMaxAge();//返回这个cookie指定的最长存活时期

         2.   Session对象

    //有两层含义,其一是创建新的session会话,其二是得到该web客户端对应的会话
    HttpSession session = request.getSession();
    session.getId()//获取session的ID
    session.isNew()//判断其是否新旧
    session.setAttribute("name", "xiaoming");//绑定域中的信息
    String name = (String)session.getAttribute("name");//获取域中指定绑定的信息
    Long time = session.getLastAccessedTime();//获取会话最后的请求时间
    session.invalidate()//终止这个session。所有绑定在这个session上的数据都会被清除。
  • 相关阅读:
    设置java.library.path的值(Mac/Linux/Windows)
    英特尔老款CPU支持虚拟化对照表(转)
    长城小主机GW1等型号进BIOS的设置方法
    Mac 10.12允许任何来源
    DDos与CC攻击的简单个人理解
    Mac 10.12下iTerm2使用lrzsz上传下载文件
    Mac 10.12连接iSCSI硬盘软件iSCSI Initiator X
    华为S5300系列交换机V100R005SPH021升级补丁
    华为S5300系列交换机V100R005SPH020升级补丁
    华为S5300系列交换机V100R006SPH019升级补丁
  • 原文地址:https://www.cnblogs.com/luihengk/p/3984199.html
Copyright © 2011-2022 走看看