Cookie的使用,及与Session对比
Http协议的无状态性
无状态是指,当浏览器发送请求给服务器的时候,服务器响应客户端请求。但是当同一个浏览器再次发送请求给服务器的时候,服务器并不知道他就是刚才那个浏览器,简单的说就是服务器不会去记得你,所以就是无状态协议。(超文本传输协议是无状态的)
就像一个没有记忆功能的老板,你每次去他的店里买个东西,他都觉得你是第一次来这里购买。
保存用户状态的两大机制
- session(针对服务端的技术)
- cookie(针对客户端的技术)
什么是Cookie
Cookie:是Web服务器保存在客户端的一系列文本信息。
注意是保存在客户端的。
比如说登录邮箱的时候提示:十天内免登陆;购物时候的“购物车”都是用Cookie来保存信息的,保存在客户端中。
但是也有缺点:容易泄露用户信息。
使用Cookie
创建Cookie对象
- Cookie newCookie=new Cookie(String key,Object value);
写入Cookie对象
- response.addCookie(newCookie);
读取Cookie对象
- Cookie[] cookies=request.getCookies();

Cookie是以文本文件保存在客户端的信息,所以他的value值本质上是一个字符串类型的
小例子

代码只贴出了body标签下的代码
login.jsp
<body>
<h1>用户登录</h1>
<hr>
<%
request.setCharacterEncoding("utf-8");
String username="";
String password = "";
Cookie[] cookies = request.getCookies();
if(cookies!=null&&cookies.length>0)
{
for(Cookie c:cookies)
{
if(c.getName().equals("username"))
{
username = URLDecoder.decode(c.getValue(),"utf-8");//套一层URLDecoder是为了防止中文乱码
}
if(c.getName().equals("password"))
{
password = URLDecoder.decode(c.getValue(),"utf-8");
}
}
}
%>
<form name="loginForm" action="dologin.jsp" method="post">
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="username" value="<%=username %>"/></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" name="password" value="<%=password %>" /></td>
</tr>
<tr>
<td colspan="2"><input type="checkbox" name="isUseCookie" checked="checked"/>十天内记住我的登录状态</td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" value="登录"/><input type="reset" value="取消"/></td>
</tr>
</table>
</form>
</body>
doLogin.jsp
<body>
<h1>登录成功</h1>
<hr>
<br>
<br>
<br>
<%
request.setCharacterEncoding("utf-8");
//首先判断用户是否选择了记住登录状态
String[] isUseCookies = request.getParameterValues("isUseCookie");
if(isUseCookies!=null&&isUseCookies.length>0)
{
//把用户名和密码保存在Cookie对象里面
String username = URLEncoder.encode(request.getParameter("username"),"utf-8");
//使用URLEncoder解决无法在Cookie当中保存中文字符串问题
String password = URLEncoder.encode(request.getParameter("password"),"utf-8");
Cookie usernameCookie = new Cookie("username",username);
Cookie passwordCookie = new Cookie("password",password);
usernameCookie.setMaxAge(864000);
passwordCookie.setMaxAge(864000);//设置最大生存期限为10天
response.addCookie(usernameCookie);
response.addCookie(passwordCookie);
}
else //没有勾选的话,就准备清除相应的cookie
{
Cookie[] cookies = request.getCookies();
if(cookies!=null&&cookies.length>0)
{
for(Cookie c:cookies)
{
if(c.getName().equals("username")||c.getName().equals("password"))
{
c.setMaxAge(0); //设置Cookie失效
response.addCookie(c); //重新保存。
}
}
}
}
%>
<a href="users.jsp" target="_blank">查看用户信息</a>
</body>
user.jsp
<body>
<h1>用户信息</h1>
<hr>
<%
request.setCharacterEncoding("utf-8");
String username="";
String password = "";
Cookie[] cookies = request.getCookies();
if(cookies!=null&&cookies.length>0)
{
for(Cookie c:cookies)
{
if(c.getName().equals("username"))
{
username = URLDecoder.decode(c.getValue(),"utf-8");
}
if(c.getName().equals("password"))
{
password = URLDecoder.decode(c.getValue(),"utf-8");
}
}
}
%>
<BR>
<BR>
<BR>
用户名:<%=username %><br>
密码:<%=password %><br>
</body>
几个注意的点:
- response.addCookie(key,value);//将Cookie添加到客户端中
- request.setCharacterEncoding("utf-8");//设置编码格式为utf-8
- URLEncoder.encode(request.getParameter("username"),"utf-8");//可以防止中文乱码
这时候可以测试,把所有浏览器关掉再去打开doLogin页面发现username还是可以获取到,这样就可以说明是Cookie保存了用户名信息,而不是session(在session中,关闭浏览器,则会话结束,所有信息就丢失了。)
Session和Cookie的区别

浏览记录,访问习惯,兴趣等适合保存在cookie中,也就是客户端中,而session中保存的是一些重要信息。session的安全性比cookie要高。

浙公网安备 33010602011771号