Cookie(曲奇饼干)
Cookie是一种客户端的会话管理技术
Cookie由服务器端生成,存放到客户端的小型文本文件,用于存储一些少量的数据
一个Cookie只能存放一项信息,以名称-值对的形式存储数据,名称和值都是字符串。
Cookie和响应一起发送到客户端,Cookie是作为响应报头/标头被发送到客户端,所以必须调用响应对象的addCookie(Cookie c)方法将Cookie对象添加到响应对象,Cookie才会被存到客户端
默认一个Cookie在浏览器关闭后被清除,默认是浏览器会话结束清除Cookie
每个主机只能获取自己存放的Cookie,一个主机/一个域名存放的Cookie只能自己读取,其他主机/域名不能读取这些Cookie,如百度存放的Cookie只能百度读取,网易的Cookie只能网易用。
一旦存放了Cookie,则下次向该程序发送请求的时候,Cookie会跟着请求一起被发送到服务器端。Cookie作为请求的报头和请求一起发送到服务器端。
一个Cookie只能包含一项标记信息,以键-值对的形式存放。
Cookie不安全,容易被攻击或篡改,不宜存放机密数据,cookie信息不应太大,否则发送数据量大,影响传输。Cookie适合存放少量非机密信息在客户端。如访问时间,浏览历史,会话id等
Cookie可被客户端删除或禁用。
Cookie的数量、大小限制等因浏览器而不同。一些浏览器限制每个域名不超过30-50个Cookie,一个Cookie大小不超过4kb,但具体因浏览器不同。
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登录首页</title>
<link rel="stylesheet" href="css/bootstrap.min.css"/>
<link rel="stylesheet" href="css/style.css"/>
<style>
label:hover{
cursor: pointer;
text-decoration: underline;
}
</style>
</head>
<body>
<div class="container">
<br>
<p class="text-danger">
* 本程序没有连接数据库,使用账户anna和密码1234可以通过登录验证 <br>
* 本程序使用Cookie实现记住用户密码的功能
</p>
<%
//JSP提供隐式对象request,表示该页面收到的请求
//通过请求对象可以获取到该程序放的所有Cookie,以Cookie数组的形式返回
Cookie[] cks=request.getCookies();
//也可能一个Cookie都没有,则无需遍历Cookie数组,直接返回
if(null==cks) return;
//定义两个变量,用于存储Cookie的值
String uname="";
String upwd="";
//如果有Cookie,则遍历Cookie数组,读取Cookie的值即可
for(Cookie c:cks){ //对于数组cks中的每个Cookie对象
//如果当前遍历的cookie的名称是username
if("username".equals(c.getName()))
uname=c.getValue(); //获取其值,存储到变量uname中
else if("userpwd".equals(c.getName())) //如果当前遍历的cookie的名称是userpwd
upwd=c.getValue(); //获取其值,存储到变量upwd中
}
%>
<!--
这里将两个文本框的值分别设置为两个Cookie的值
如果有对应的Cookie值,则会显示在文本框中
如果没有对应的Cookie值,则显示空白,也就是记住密码的功能
-->
<form action="ls" class="form-inline text-center loginForm bg-primary">
<h1 class="text-center">用户登录</h1>
<hr>
<br>
账 号: <input type="text" name="username" value="<%=uname%>" class="form-control">
<br><br>
密 码: <input type="password" name="password" value="<%=upwd%>" class="form-control">
<br><br>
<input type="checkbox" id="remember" name="rem" value="Y">
<label for="remember">记住密码</label>
<input type="submit" value="登录" class="btn btn-sm btn-default">
</form>
</div>
</body>
</html>
对应servelet代码:
package com.qdu.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/ls")
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String uname = req.getParameter("username");
String pwd = req.getParameter("password");
//创建Cookie,用于存储少量的用户信息
//Cookie是一种客户端技术,用于存储少量的用户信息
//Cookie是服务器端创建,发送到客户端,存储在客户端的小型文本文件
//使用Cookie类创建和操作Cookie
//Cookie是以键-值对的形式存储数据,键和值都是字符串
//一个Cookie只能用于存储一项信息
//默认情况下Cookie是浏览器会话范围的cookie,随着浏览器关闭,Cookie会立刻被删除
Cookie ck1 = new Cookie("username", uname);
Cookie ck2 = new Cookie("userpwd", pwd);
String rem = req.getParameter("rem");
//可以设置Cookie的最大时间,也就是Cookie存在客户端多久,单位是秒
//如果设置了最大时间,则在到期前,即使关闭浏览器再打开,Cookie依然会存在
if ("Y".equals(rem)) { //如果用户选择记住密码,则设置Cookie 存在7天
ck1.setMaxAge(7 * 24 * 60 * 60);
ck2.setMaxAge(7 * 24 * 60 * 60);
}else{ //否则立刻删除Cookie
//考虑到用户可能上次记住,存储了cookie,这次选择不记住,则该种情况下要删除Cookie
//Cookie类没有提供专门的方法用于删除一个Cookie
ck1.setMaxAge(0); //最大时间为0意味着立刻删除Cookie
ck2.setMaxAge(0);
}
//Cookie需要存储到客户端,所以需要和响应一起发送到客户端并存储在客户端
//只不过是作为响应的报头/标头发送给客户端的
//必须在设置好Cookie之后,将Cookie添加到响应对象中,才能发送到客户端
resp.addCookie(ck1);
resp.addCookie(ck2);
if ("anna".equals(uname) && "1234".equals(pwd)) {
//HttpServletResponse的sendRedirect()方法用于重定向到指定页面作为响应内容
resp.sendRedirect("success.jsp"); //succeed
} else {
resp.sendRedirect("fail.html");
}
}
}