自动登陆–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的操作时很简单的,因为复杂的东西都被别人封装好了。我这样写代码也算是一种使用的封装。这三段代码写的和某个系统完全无关,可不是简单的一写就行了,其中包含着我的考虑,以下我将列举我的考虑。
不像是其他代码一样,在cookie中插入用户账号和密码
恕我直言,在cookie中插入用户的账号密码,简直就是傻瓜的做法。如果有一天,用户的电脑掉了,那么是不是密码就外泄了。使用Http-Only
使用Http-Only主要是防止攻击者使用JS获得cookie或者session劫持,如果这时候,你的cookie有大量的敏感信息,那对于他来说,那真是美味的cookie(甜点)。为了防止坏人用客户的cookie作为长久登陆的后门
我觉得cookie应该在每次登录之后进行更新,当然你也可以设定在每次用户修改密码的时候,生成新的cookie存入数据库。cookie值存放的地方
数据库是一个不错的地方,你觉得呢。
本人技术有限,这只是我的观点和看法,欢迎讨论哈。