• session &cookie


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

    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功能需要浏览器的支持。

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

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

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

     

     

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

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

    实现用户登录

    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所示。

    图 使用Session记录用户信息

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

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

  • 相关阅读:
    前端性能优化 —— reflow(回流)和repaint(重绘)
    前端性能优化 —— 文档在浏览器中的加载和渲染
    前端性能优化 —— 起步篇(一)
    zepto源码研究
    zepto源码研究
    zepto源码研究
    zepto源码研究
    zepto源码研究
    zepto源码研究
    zepto源码研究
  • 原文地址:https://www.cnblogs.com/gs-34/p/10622128.html
Copyright © 2020-2023  润新知