http协议的无状态性
无状态是指,当浏览器发送请求给服务器的时候,服务器响应客户端请求。
但是当同一个浏览器再次发送请求给服务器的时候,服务器并不知道它就是刚才那个浏览器。
简单的说,就是服务器不会去记得你,所以就是无状态协议。
Cookie概述
保存用户的状态的两大机制
Session
Cookie
什么是cookie?
Cookie是web服务器保存在客户端的一系列文本信息。
典型应用一、登陆时记住密码
典型应用二、记录客户所浏览过的商品
看视频的时候,视频软件会记录已经浏览过的视频
Cookie的作用
- 对特定对象的追踪
- 保存用户网页浏览记录与习惯
- 简化登陆
安全风险:容易泄露用户信息
在JSP页面中创建与使用cookie
创建cookie对象
Cookie cookie = new Cookie(String key,Object value);
写入Cookie对象
Response.addCookie(cookie);
读取Cookie对象
Cookie[] cookies = request.getCookies();
常用方法:
方法 | 说明 |
Void setMaxAge(int expiry) | 设置cookie的有效期,以秒为单位 |
Void setValue(String value) | 在cookie创建好后,对cookie进行赋值 |
String getName() | 获取cookie的名称 |
String getValue() | 获取cookie的值 |
Int getMaxAge() | 获取cookie的有效时间,以秒为单位 |
Cookie在登陆中的应用
JSP中创建与使用cookie
实现记忆用户名和密码功能
案例:
在login.jsp中输入:
<%
String username = "";
String password = "";
Cookie[] cookies = request.getCookies();
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");
}
}
%>
<form 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" checked="checked" name="isCookie" value="true">记住密码</td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="登陆"></td>
</tr>
</table>
</form>
在dologin.jsp中输入:
<%
request.setCharacterEncoding("utf-8");
String isCookie = request.getParameter("isCookie");
String username = URLEncoder.encode(request.getParameter("username"), "utf-8");
String password = URLEncoder.encode(request.getParameter("password"), "utf-8");
if(isCookie != null){ //用户勾选了保存密码
Cookie usernameCookie = new Cookie("username",username); //创建cookie
Cookie passwordCookie = new Cookie("password",password);
usernameCookie.setMaxAge(60);//设置cookie的有效期
passwordCookie.setMaxAge(60);
response.addCookie(usernameCookie);
response.addCookie(passwordCookie);
}else{ //用户没有勾选,需要将之前保存了密码的信息也给删掉
Cookie[] cookies = request.getCookies();
for(Cookie c : cookies){
if(c.getName().equals("username") || c.getName().equals("password")){
c.setMaxAge(0); //设置cookie 失效
response.addCookie(c); //重新保存cookie
}
}
}
%>
<h5>登陆成功!</h5>
<a href="main.jsp">查看用户信息!</a>
在main.jsp中输入:
<%
String username = "";
String password = "";
Cookie[] cookies = request.getCookies();
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") ;
}
}
%>
用户名:<%=username %><br>
密码:<%=password %>
Session与cookie的对比
Session | Cookie |
在服务器端内存中保存用户信息 | 在客户端保存用户信息 |
Session中保存的时Object类型 | Cookie保存的时String类型 |
随会话的结束而将其存储的数据销毁 | Cookie可以长期保存在客户端 |
保存重要的信息 | 保存不重要的信息 |