zoukankan      html  css  js  c++  java
  • JavaWeb基础—会话管理之Cookie

    一、什么是会话

      打开浏览器,浏览各种资源,点击各种超链接,直至关闭浏览器,整个过程称为会话

    二、会话管理的两种技术

      1.Cookie

        基于客户端。在客户端记录信息来确认用户身份。以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。

      2.Session

        基于服务端。在服务端记录信息来确认身份。session类似于客户端在服务器端的账户。使用Map存放。服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象。

      更多cookie与session机制请参见:http://blog.csdn.net/fangaoxin/article/details/6952954/

    三、Cookie的用途 

       cookie是无法跨域的,访问百度只能带百度的cookie,访问网易只能带网易的cookie

       Cookie的用途:
          服务器用来跟踪客户端状态
          保存购物车等
          显示上次登录的名称

      (常用为保存购物车,自动登陆)

    四、Cookie常用API

      在 javax.servlet.http.Cookie这个包中,可以查询到几个常见的API

        Cookie(String name, String value) : Cookie的构造器

        get/setMaxAge(int age) : 操作cookie的最大存活时间(cookie的有效期),设置了有效期后关闭浏览器会把cookie保存到硬盘上。不设置则关闭了浏览器会话就结束了,cookie也就不存在了。<0则在内存中的寿命以秒为单位。>0为设置一个过期时间,=0就是杀死了。

        getName() : 得到cookie的名字

        get/setValue(String newValue) : 操作cookie的值

        get/setPath() : 操作cookie的有效路径,比如把cookie的有效路径设置为"/xdp",那么浏览器访问"xdp"目录下的web资源时,都会带上cookie

    五、javaWeb中操作cookie

    便捷方式(精通):response.addCookie():服务器向客户端(浏览器)保存cookie  服务端送出(add)
             request.getCookies():加了s,返回的是浏览器归还的cookies(数组)  客户端拿(get)

             例如得到最后一次登陆时间: 

    
    
     PrintWriter out = response.getWriter();
            //获取浏览器访问访问服务器时传递过来的cookie数组
             Cookie[] cookies = request.getCookies();
            //如果用户是第一次访问,那么得到的cookies将是null
             if (cookies!=null) {
                 out.write("您上次访问的时间是:");
                 for (int i = 0; i < cookies.length; i++) {
                    Cookie cookie = cookies[i];
                     if (cookie.getName().equals("lastAccessTime")) {
                        Long lastAccessTime =Long.parseLong(cookie.getValue());
                         Date date = new Date(lastAccessTime);
                         out.write(date.toLocaleString());
                    }
                 }
             }else {
                 out.write("这是您第一次访问本站!");
            }
             
             //用户访问过之后重新设置用户的访问时间,存储到cookie中,然后发送到客户端浏览器
             Cookie cookie = new Cookie("lastAccessTime", System.currentTimeMillis()+"");//创建一个cookie,cookie的名字是lastAccessTime
            //将cookie对象添加到response对象中,这样服务器在输出response对象中的内容时就会把cookie也输出到客户端浏览器
             response.addCookie(cookie);
        }
    
    

     六、封装根据cookie的name获取value的方法

      参考自http://www.cnblogs.com/muzongyan/archive/2010/08/30/1812552.html

      核心思想就是将cookie封装进map,其中key为其name,value为cookie本身,这样,就能通过操作map达到操作cookie的目的:
    /**
         * 根据cookie的name返回cookie的value
         * @param request
         * @param name
         * @return
         */
        public static Cookie getCookieByName(HttpServletRequest request, String name) {
            Map<String, Cookie> cookieMap = readCookieToMap(request);
            if (cookieMap.containsKey(name)) {
                return cookieMap.get(name);
            } else {
                return null;
            }
            
        }
        /**
         * 封装cookie为map集合
         * @param request
         * @return
         */
        public static Map<String,Cookie> readCookieToMap(HttpServletRequest request) { 
            Cookie[] cookies = request.getCookies();
            Map<String,Cookie> cookieMap = new HashMap<String, Cookie>();
            if (cookies != null) {
                for (Cookie cookie : cookies) {
                    cookieMap.put(cookie.getName(), cookie);
                }
            } 
            return cookieMap;
        }

      jeesite中的cookieUtil(可参考)

    /**
     * Copyright &copy; 2012-2016 <a href="https://github.com/thinkgem/jeesite">JeeSite</a> All rights reserved.
     */
    package com.thinkgem.jeesite.common.utils;
    
    import java.io.UnsupportedEncodingException;
    import java.net.URLDecoder;
    import java.net.URLEncoder;
    
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * Cookie工具类
     * @author ThinkGem
     * @version 2013-01-15
     */
    public class CookieUtils {
    
        /**
         * 设置 Cookie(生成时间为1天)
         * @param name 名称
         * @param value 值
         */
        public static void setCookie(HttpServletResponse response, String name, String value) {
            setCookie(response, name, value, 60*60*24);
        }
        
        /**
         * 设置 Cookie
         * @param name 名称
         * @param value 值
         * @param maxAge 生存时间(单位秒)
         * @param uri 路径
         */
        public static void setCookie(HttpServletResponse response, String name, String value, String path) {
            setCookie(response, name, value, path, 60*60*24);
        }
        
        /**
         * 设置 Cookie
         * @param name 名称
         * @param value 值
         * @param maxAge 生存时间(单位秒)
         * @param uri 路径
         */
        public static void setCookie(HttpServletResponse response, String name, String value, int maxAge) {
            setCookie(response, name, value, "/", maxAge);
        }
        
        /**
         * 设置 Cookie
         * @param name 名称
         * @param value 值
         * @param maxAge 生存时间(单位秒)
         * @param uri 路径
         */
        public static void setCookie(HttpServletResponse response, String name, String value, String path, int maxAge) {
            Cookie cookie = new Cookie(name, null);
            cookie.setPath(path);
            cookie.setMaxAge(maxAge);
            try {
                cookie.setValue(URLEncoder.encode(value, "utf-8"));
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            response.addCookie(cookie);
        }
        
        /**
         * 获得指定Cookie的值
         * @param name 名称
         * @return*/
        public static String getCookie(HttpServletRequest request, String name) {
            return getCookie(request, null, name, false);
        }
        /**
         * 获得指定Cookie的值,并删除。
         * @param name 名称
         * @return*/
        public static String getCookie(HttpServletRequest request, HttpServletResponse response, String name) {
            return getCookie(request, response, name, true);
        }
        /**
         * 获得指定Cookie的值
         * @param request 请求对象
         * @param response 响应对象
         * @param name 名字
         * @param isRemove 是否移除
         * @return*/
        public static String getCookie(HttpServletRequest request, HttpServletResponse response, String name, boolean isRemove) {
            String value = null;
            Cookie[] cookies = request.getCookies();
            if (cookies != null) {
                for (Cookie cookie : cookies) {
                    if (cookie.getName().equals(name)) {
                        try {
                            value = URLDecoder.decode(cookie.getValue(), "utf-8");
                        } catch (UnsupportedEncodingException e) {
                            e.printStackTrace();
                        }
                        if (isRemove) {
                            cookie.setMaxAge(0);
                            response.addCookie(cookie);
                        }
                    }
                }
            }
            return value;
        }
    }
    View Code
  • 相关阅读:
    Windows Server 2012配置开机启动项
    Windows Server 2019 SSH Server
    NOIP2017 senior A 模拟赛 7.7 T1 棋盘
    Noip 2015 senior 复赛 Day2 子串
    Noip 2015 senior复赛 题解
    Noip 2014 senior Day2 解方程(equation)
    Noip 2014 senior Day2 寻找道路(road)
    Noip 2014 senior Day2 无线网络发射器选址(wireless)
    Noip2014senior复赛 飞扬的小鸟
    Noip 2014 senior 复赛 联合权值(link)
  • 原文地址:https://www.cnblogs.com/jiangbei/p/6683265.html
Copyright © 2011-2022 走看看