zoukankan      html  css  js  c++  java
  • session and cookie

    会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份Session通过在服务器端记录信息确定用户身份

    本章将系统地讲述Cookie与Session机制,并比较说明什么时候不能用Cookie,什么时候不能用Session。

     

    1.1  Cookie机制

    在程序中,会话跟踪是很重要的事情。理论上,一个用户的所有请求操作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个会话,二者不能混淆。例如,用户A在超市购买的任何商品都应该放在A的购物车内,不论是用户A什么时间购买的,这都是属于同一个会话的,不能放入用户B或用户C的购物车内,这不属于同一个会话。

    而Web应用程序是使用HTTP协议传输数据的。HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。即用户A购买了一件商品放入购物车内,当再次购买商品时服务器已经无法判断该购买行为是属于用户A的会话还是用户B的会话了。要跟踪该会话,必须引入一种机制。

    Cookie就是这样的一种机制。它可以弥补HTTP协议无状态的不足。在Session出现之前,基本上所有的网站都采用Cookie来跟踪会话。

    1.1.1  什么是Cookie

    Cookie意为“甜饼”,是由W3C组织提出,最早由Netscape社区发展的一种机制。目前Cookie已经成为标准,所有的主流浏览器如IE、Netscape、Firefox、Opera等都支持Cookie。

    由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份。怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie的工作原理

    Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客 户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务 器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。

     

     

    查看某个网站颁发的Cookie很简单。在浏览器地址栏输入javascript:alert (document. cookie)就可以了(需要有网才能查看)。JavaScript脚本会弹出一个对话框显示本网站颁发的所有Cookie的内容,如图1.1所示。

    图1.1  Baidu网站颁发的Cookie

     

    图1.1中弹出的对话框中显示的为Baidu网站的Cookie。其中第一行BAIDUID记录的就是笔者的身份helloweenvsfei,只是Baidu使用特殊的方法将Cookie信息加密了。

    除了使用Cookie,Web应用程序中还经常使用Session来记录客户端状态。Session是服务器端使用的一种记录客户端状态的机制,使用上比Cookie简单一些,相应的也增加了服务器的存储压力

    1.2.1  什么是Session

    Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。

    如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。

    1.2.2  实现用户登录

    Session对应的类为javax.servlet.http.HttpSession类。每个来访者对应一个Session对象,所有该客户的状态信息都保存在这个Session对象里。Session对象是在客户端第一次请求服务器的时候创建的。 Session也是一种key-value的属性对,通过getAttribute(Stringkey)和setAttribute(String key,Objectvalue)方法读写客户状态信息。Servlet里通过request.getSession()方法获取该客户的 Session,

    例如:

    HttpSession session = request.getSession();       // 获取Session对象

    session.setAttribute("loginTime", new Date());     // 设置Session中的属性

       

    out.println("登录时间为:" +(Date)session.getAttribute("loginTime"));      // 获取Session属性

    request还可以使用getSession(boolean create)来获取Session。区别是如果该客户的Session不存在,request.getSession()方法会返回null,而 getSession(true)会先创建Session再将Session返回。

    Servlet中必须使用request来编程式获取HttpSession对象,而JSP中内置了Session隐藏 对象,可以直接使用。如果使用声明了<%@page session="false" %>,则Session隐藏对象不可用。下面的例子使用Session记录客户账号信息。

    源代码如下:

    代码1.9  session.jsp

    <%@ page language="java" pageEncoding="UTF-8"%>

    <jsp:directive.page import="com.helloweenvsfei.sessionWeb.bean.Person"/>

    <jsp:directive.page import="java.text.SimpleDateFormat"/>

    <jsp:directive.page import="java.text.DateFormat"/>

    <jsp:directive.page import="java.util.Date"/>

    <%!

        DateFormat dateFormat = newSimpleDateFormat("yyyy-MM-dd");         // 日期格式化器

    %>

    <%

        response.setCharacterEncoding("UTF-8");        // 设置request编码

        Person[] persons =

        {           

           // 基础数据,保存三个人的信息

            new Person("Liu Jinghua","password1", 34, dateFormat.parse
            ("1982-01-01")),

            new Person("Hello Kitty","hellokitty", 23, dateFormat.parse
            ("1984-02-21")),

            new Person("Garfield", "garfield_pass",23, dateFormat.parse
            ("1994-09-12")),

         };

       

        String message = "";                      // 要显示的消息

       

        if(request.getMethod().equals("POST"))

        { 

            // 如果是POST登录       

            for(Person person :persons)

            {           

                // 遍历基础数据,验证账号、密码

                // 如果用户名正确且密码正确

               if(person.getName().equalsIgnoreCase(request.getParameter("username"))&&person.getPassword().equals(request.getParameter("password")))

               {              

                   // 登录成功,设置将用户的信息以及登录时间保存到Session

                   session.setAttribute("person", person);                   // 保存登录的Person

                   session.setAttribute("loginTime", new Date());          // 保存登录的时间              

                   response.sendRedirect(request.getContextPath() + "/welcome.jsp");

                   return;

                }

            }      

            message = "用户名密码不匹配,登录失败。";       // 登录失败

        }

    %>

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01Transitional//EN">

    <html>

        // ... HTML代码为一个FORM表单,代码略,请看随书光盘

    </html>

     

    登录界面验证用户登录信息,如果登录正确,就把用户信息以及登录时间保存进Session,然后转到欢迎页面welcome.jsp。welcome.jsp中从Session中获取信息,并将用户资料显示出来。

    welcome.jsp代码如下:

    代码1.10  welcome.jsp

    <%@ page language="java" pageEncoding="UTF-8"%>

    <jsp:directive.pageimport="com.helloweenvsfei.sessionWeb.bean.Person"/>

    <jsp:directive.page import="java.text.SimpleDateFormat"/>

    <jsp:directive.page import="java.text.DateFormat"/>

    <jsp:directive.page import="java.util.Date"/>

    <%!

        DateFormat dateFormat = newSimpleDateFormat("yyyy-MM-dd");         // 日期格式化器

    %>

    <%

        Person person =(Person)session.getAttribute("person");                       // 获取登录的person

        Date loginTime =(Date)session.getAttribute("loginTime");                     // 获取登录时间

    %>

        // ... 部分HTML代码略

                <table>

                   <tr><td>您的姓名:</td>

                       <td><%= person.getName()%></td>

                   </tr>

                   <tr><td>登录时间:</td>

                       <td><%= loginTime%></td>

                   </tr>

                   <tr><td>您的年龄:</td>

                       <td><%= person.getAge()%></td>

                   </tr>

                   <tr><td>您的生日:</td>

                       <td><%=dateFormat.format(person.getBirthday()) %></td>

                   </tr>

                </table>

    程序运行效果如图1.8所示。

    图1.8  使用Session记录用户信息

    注意程序中Session中直接保存了Person类对象与Date类对象,使用起来要比Cookie方便。

    当多个客户端执行程序时,服务器会保存多个客户端的Session。获取Session的时候也不需要声明获取谁的Session。Session机制决定了当前客户只会获取到自己的Session,而不会获取到别人的Session。各客户的Session也彼此独立,互不可见

     

    注意:Cookie功能需要浏览器的支持。

    如果浏览器不支持Cookie(如大部分手机中的浏览器)或者把Cookie禁用了,Cookie功能就会失效。

    不同的浏览器采用不同的方式保存Cookie。

    IE浏览器会在“C:Documents and Settings你的用户名Cookies”文件夹下以文本文件形式保存,一个文本文件保存一个Cookie。

  • 相关阅读:
    javascript的一些知识
    ASP.NET SignalR入门
    js最详细的基础,jquery 插件最全的教材
    silverlight 流程设计器,流程引擎
    C# 字符串操作类
    线程间操作无效: 从不是创建控件“...”的线程访问它 问题解决
    ASP.NET常用函数(参考用)
    VisualStudio自动编码插件(Autocode——devprojects.net)
    SQL Server 2005 处理交叉表
    C# Winform中无焦点状态下获取键盘输入或者USB扫描枪数据
  • 原文地址:https://www.cnblogs.com/zyhello/p/10596797.html
Copyright © 2011-2022 走看看