zoukankan      html  css  js  c++  java
  • 会话跟踪之Cookie

    一:简介

       Cookie主要用来存储用户信息,追踪用户会话。web客户端访问服务端直接采用的协议是Http,Http协议是一种无状态协议,无状态表现在不能够保留用户访问状态,无法记录用户信息。每一次的请求,在响应后就会断开,再次访问的时候就会是一个新的请求。比如用户A访问了一次服务,再次访问的时候服务端无法得知该用户是否还是A,它会当做是一个新的用户。为了解决这一问题,产生了Cookie。

             用户首次访问的时候,服务端会记录该用户的信息(或者说身份凭证),当再次访问服务的时候,服务端要求客户端携带用户信息,服务端进行确认。辨别出是哪个用户,哪个会话。

        Cookie中是以键值对的方式存储信息的。它并没有提供专门的修改和删除Api,往往要达到这个功能,需要重新定义同名称的Cookie值进行覆盖[更新]、如果是删除操作,那么不仅要定义一个同名的Cookie,并且需要吧maxAge设置为0,表明该Cookie的有效期为0[即代表删除]。

    二:属性列表

     三:Cookie的不可跨域性

      同一个浏览器,访问不同的网址(服务器),如一个访问百度,一个访问谷歌,可能两个服务都需要Cookie信息。但是你在后端服务中操作Cookie的时候,百度的只能操作百度的Cookie;谷歌仅能操作谷歌的Cookie,两者是不会交叉的。原因是浏览器已经对其进行了区分,依据的就是域名。比如:www.google.com和www.image.google.com两个虽然都是google旗下的,但是也属于不同的域名,所以Cookie也是不同的。【但是反过来说,你如果访问了Google的某个产品,然后进行了登录操作。那么再访问其他Google产品的时候不用进行登录则可以直接进行操作,关键是调整了domain属性】

    四:代码演示

      本例演示利用Cookie保存用户信息,并记录网站的访问次数:

    login.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ page isErrorPage="true" %>
    <%
        //设置请求和响应的编码格式
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        
        if("POST".equals(request.getMethod())){
            //保存Cookie信息
            Cookie nameCookie = new Cookie("username",request.getParameter("name"));
            Cookie visitTimesCookie = new Cookie("visitTimes","0");
            
            response.addCookie(nameCookie);
            response.addCookie(visitTimesCookie);
            
            //记录用户信息完毕,重定向到cookie.jsp
            response.sendRedirect("./cookie.jsp");
            
            return;
        }
    %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>登录界面</title>
    </head>
    <body>
        <form action="./login.jsp" method="POST">
            <table>
                <!-- 输出错误信息 -->
                <tr>
                    <td colspan="2"><%=exception.getMessage()%></td>
                </tr>
                <tr>
                    <td>账号:</td>
                    <td><input type="text" name="name"></td>
                </tr>
                <tr>
                    <td>密码:</td>
                    <td><input type="password" name="pwd"></td>
                </tr>
            </table>
            <input type="submit" value="登录">
        </form>
    </body>
    </html>

    cookie.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <%@ page errorPage="./login.jsp" %>
        <%
            //设置请求和响应的编码格式
            request.setCharacterEncoding("utf-8");
            response.setCharacterEncoding("utf-8");
            
            Cookie[] cookies =  request.getCookies();
            
            String username = "";
            int visitTimes = 0;
            
            for(int i=0;i<cookies.length;i++){
                //获取单个Cookie
                Cookie cookie = cookies[i];
                System.out.println(cookie);
                if("username".equals(cookie.getName())){
                    //获取用户名
                    username = cookie.getName();                
                }else if("visitTimes".equals(cookie.getName())){
                    visitTimes = Integer.parseInt(cookie.getValue());
                }
                
                if(username==null || username.trim().equals("")){
                    //抛出异常,则跳转到error界面[login.jsp]
                    throw new Exception("您还没有登录,请先登录!");
                }
            }
            
            //修改Cookie信息,更新访问次数,覆盖Cookie中的visitTimes字段
            Cookie newCookie = new Cookie("visitTimes",String.valueOf(++visitTimes));
            //设置Cookie
            response.addCookie(newCookie);
        %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>会话跟踪:跟踪用户的整个会话</title>
    </head>
    <body>
        <h4>登录信息</h4>
        <hr>
        <span>您的账号:</span><span><%=username %></span><br>
        <span>访问次数:</span><span><%=visitTimes %></span><br>
        <button onclick="refresh()">刷新</button>
        <script type="text/javascript">
            function refresh(){
                var time = new Date().getTime();
                window.location.href='./cookie.jsp?ts='+time;
            }
        </script>
    </body>
    </html>
  • 相关阅读:
    【转载】久坐如吸烟
    【转载】实用的人际关系经验
    【原创】Apache服务器500错误失去响应的问题解决
    【原创】JAVA word转html
    【原创】Linux下的ngix服务器安装步骤
    【原创】Apache和基于虚拟主机的Tomcat集群方案
    网络编程基础知识
    多线程1
    字符流
    字节流
  • 原文地址:https://www.cnblogs.com/wooyoohoo/p/9478232.html
Copyright © 2011-2022 走看看