自动登陆--Cookie

自动登陆–Cookie

  • 自动登陆Cookie
    • Cookie
    • 特点
    • 作用
    • 限制
    • 使用方法
      • 准备工作
      • 增加cookie
      • 获得cookie
      • 删除cookie
    • 再来两句

Cookie是由Servlet API提供的类,是Web服务器发送给客户端的一小段信息。客户端在请求时,可以读取信息并发送到服务器端,Cookie中包含多个名称/值对,服务器发送一个Cookie时,客户端可以接受并保存这个Cookie。服务器可以设置Cookie的名称、值、存活时间以及版本。

特点

HTTP是无状态的,对于一个浏览器多次请求,Web服务器是不能区分的,所以需要额外的数据进行维护。Cookie是通过客户端保持状态的解决方案,Cookie就是服务器给客户端发送的特殊信息,这些信息以文本的形式存放在客户端中,然后客户端每次向服务器请求的时候,都会带上这些特殊的信息。

与Cookie相对的一个解决方案是Session,它是通过服务器来保持状态的。

作用

Cookie只是一段文本,所以它只能保存字符串。而且浏览器对它有大小限制以及 它会随着每次请求被发送到服务器,所以应该保证它不要太大。 Cookie的内容也是明文保存的,有些浏览器提供界面修改,所以, 不适合保存重要的或者涉及隐私的内容。

限制

大多数浏览器支持最大为 4096 字节的 Cookie。由于这限制了 Cookie 的大小,最好用 Cookie 来存储少量数据,或者存储用户 ID 之类的标识符。用户 ID 随后便可用于标识用户,以及从数据库或其他数据源中读取用户信息。 浏览器还限制站点可以在用户计算机上存储的 Cookie 的数量。大多数浏览器只允许每个站点存储 20 个 Cookie;如果试图存储更多 Cookie,则最旧的 Cookie 便会被丢弃。有些浏览器还会对它们将接受的来自所有站点的 Cookie 总数作出绝对限制,通常为 300 个。

使用方法

准备工作

public static final String SessionID = "网站名-" +"UserSessionID";

增加cookie

      /**
       * @description 增加cookie
       */
       public boolean addCookie(HttpServletRequest request,HttpServletResponse response ) {
            Cookie cookie = new Cookie(SessionID, UUID.randomUUID().toString());
             cookie.setMaxAge(60 * 60 * 24 * 7);// cookie保存一周
             cookie.setPath("/" );// 设置cook可以应用的路径,例如/user /manager
             cookie.setHttpOnly(true);// 防止脚本攻击
             response.addCookie(cookie );//重点
             try {
                   return !("" .equals(getCookie(request)));
            } catch (Exception e ) {
                   e.printStackTrace();
                   return false ;
            }
      }

获得cookie

      /**
       * @param request HttpServletRequest
       * @description 获得cookie
       */
       public String getCookie(HttpServletRequest request)
                   throws Exception {
            Cookie[] cookies = request .getCookies();//重点
            String value ="" ;
             if (cookies != null) {
                   for (Cookie cookie : cookies) {
                         if (CookieUtils.SessionID .equals(cookie.getName())) { //找到SessionID
                               value = cookie .getValue();
                               break;
                        }
                  }
            }
             return value ;
      }

删除cookie

      /**
       * @param request HttpServletRequest
       * @description 删除cookie
       */
       public boolean delCookie(HttpServletRequest request) {
            Cookie[] cookies = request .getCookies();//重点
             if (cookies != null) {
                   for (Cookie cookie : cookies) {
                         if (SessionID .equals(cookie.getName())) {
                               cookie.setValue("" );
                               cookie.setMaxAge(0);
                               cookie.setPath("/" );
                               break;
                        }
                  }
            }
             try {
                   return "" .equals(getCookie(request));
            } catch (Exception e ) {
                   e.printStackTrace();
                   return false ;
            }
      }

再来两句

其实对于Cookie的操作时很简单的,因为复杂的东西都被别人封装好了。我这样写代码也算是一种使用的封装。这三段代码写的和某个系统完全无关,可不是简单的一写就行了,其中包含着我的考虑,以下我将列举我的考虑。

  1. 不像是其他代码一样,在cookie中插入用户账号和密码
    恕我直言,在cookie中插入用户的账号密码,简直就是傻瓜的做法。如果有一天,用户的电脑掉了,那么是不是密码就外泄了。

  2. 使用Http-Only
    使用Http-Only主要是防止攻击者使用JS获得cookie或者session劫持,如果这时候,你的cookie有大量的敏感信息,那对于他来说,那真是美味的cookie(甜点)。

  3. 为了防止坏人用客户的cookie作为长久登陆的后门
    我觉得cookie应该在每次登录之后进行更新,当然你也可以设定在每次用户修改密码的时候,生成新的cookie存入数据库。

  4. cookie值存放的地方
    数据库是一个不错的地方,你觉得呢。

本人技术有限,这只是我的观点和看法,欢迎讨论哈。

你可能感兴趣的:(项目经验)