1. http协议的无状态性
超文本传输协议(http)存在一个先天的不足,你啊就是http的无状态性。
无状态性指的是当同一个浏览器多次给服务器发送请求的时候,服务器会做出响应,但是,服务器不会知道是一个浏览器发送了这写请求。这就是http洗衣的无状态性。
因为协议的无状态性,所以服务器是记不住用户的状态的。
2. Cookie
JSP中有保存用户的两大机制:
* Session
* Cookie
2.1 Cookie概述
Cookit的中文意思叫做“小甜饼”,是Web服务器保存在客户端的一系列文本信息。
Cookie的典型用法:
* 判定注册用户是否已经登录网站
* “购物车”的处理,即保存用户添加到购物车中的信息
2.2 Cookie的作用
- 对特定对象的跟踪
- 保存用户网页浏览记录与习惯
简化登录
安全风险:容易泄漏用户的信息
2.3 JSP中创建和使用Cookie
创建Cookie对象:
Cookie newCookie =new Cookie(String key,Object value);
写入Cookie对象
respose.addCookie(newCookie);
读取Cookie
Cookie[] cookies=request.getCookies();
2.4 Cookie对象的常用方法
方法名称 | 说明 |
---|---|
void setMaxAge(int expiry) | 设置Cookie的有效期 |
void setValue(String value) | 在cookie创建后对cookie进行赋值 |
String getName() | 获取cookie的名称 |
String getValue() | 获取Cookie的值 |
int getMaxAge() | 获取Cookie的有效时间(秒) |
2.5 Cookie在登录中的应用
Cookie在登录中用于保存用户的登录信息(例如账号和密码)
(1) logon.jsp页面的主要代码
登录页构建了一个提交用户信息的表单,action的属性值定义为doLogin_cookie.jsp,将业务逻辑的操作交给doLogin_cookie.jsp页面来操作。
<%
String userName="";
String passWord="";
Cookie [] cookie=request.getCookies(); //获取Cookie
if(cookie!=null&&cookie.length>0) {
for(Cookie c: cookie) {
if(c.getName().equals("userName")) {
userName=URLDecoder.decode(c.getValue(),"utf-8"); //采用utf-8的字符集解码cookie
}
if(c.getName().equals("passWord")) {
passWord=URLDecoder.decode(c.getValue(),"utf-8");
}
}
}
%>
<h2>登录页面</h2>
<form action="doLogin_cookie.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="userCookie" checked="checked" />
是否在十天之内保存用户信息
</td>
</tr>
<tr>
<td><input type="submit" name="submit" value="登录" /></td>
</tr>
</table>
</form>
(2) doLogin_cookie.jsp页面的主要代码
doLogin_cookie.jsp页面接收登录页(login.jsp)页面提交的参数。执行下列代码,保存Cookie或不保存Cookie。最后定义一个a标签,连接到user。jsp页面。验证Cookie是否保存
<%
request.setCharacterEncoding("utf-8");
String userName="";
String passWord="";
String [] userCookie=request.getParameterValues("userCookie");
//判断用户是否保存用户Cookie
if(userCookie!=null&&userCookie.length>0) {
userName=URLEncoder.encode(request.getParameter("userName"),"utf-8"); //编码cookie的字符集为utf-8
passWord=URLEncoder.encode(request.getParameter("passWord"),"utf-8");
Cookie userNameCookie=new Cookie("userName",userName); //创建用户名的Cookie对象
Cookie passwordCookie =new Cookie("passWord",passWord); //创建用户密码的Cookie对象
response.addCookie(userNameCookie);
response.addCookie(passwordCookie);
userNameCookie.setMaxAge(864000); //设置Cookie的有效期为10天
passwordCookie.setMaxAge(864000);
}
else {
Cookie [] cookie =request.getCookies(); //获取Cookie对象
if(cookie!=null&&cookie.length>0) {
for(Cookie c: cookie) {
if(c.getName().equals("userName")||c.getName().equals("passWord")) {
c.setMaxAge(0); //设置Cookie的生命周期为0(删除Cookie)
response.addCookie(c); //设置之后要重新保存,否则无法生效
}
}
}
}
%>
<a href="users.jsp">显示用户的详细信息</a>
(3) user.jsp页面
user.jsp 页面验证cookie时候可以保存,若cookie已经保存则会显示用户名和密码。如果cookie没有保存,则用户名和密码为空:
<%
String userName="";
String passWord="";
Cookie [] cookie=request.getCookies();
if(cookie!=null&&cookie.length>0) {
for(Cookie c: cookie) {
if(c.getName().equals("userName")) {
userName=URLDecoder.decode(c.getValue(),"utf-8");
}
if(c.getName().equals("passWord")) {
passWord=URLDecoder.decode(c.getValue(),"utf-8");
}
}
}
%>
<h1>验证Cookie是否保存的页面</h1>
用户名:<%=userName %><br>
密码:<%=passWord %><br>
Tips:Cookie其实是一段纯文本文件,它的值是ASCII,所以是无法保存中文的,解决的办法就是在存储和提起Cookie的值的时候以字符集”utf-8”进行解码和编码 如下:
//编码
String userName=URLEncoder.encode(request.getParameter("userName"),"utf-8");
//解码
String userName=URLDecoder.decode(c.getValue(),"utf-8");
2.6 Session 和Cookie对比
Session | Cookie |
---|---|
用来保存用户信息 | 用来保存用户信息 |
保存的内容是Object类型的数据 | 保存的是String类型的数据 |
Session随会话的结束而在存储中被销毁 | Cookie可以长期保存 |
Session保存的是重要的信息 | Cookie保存的是不重要的信息 |
Tips:
从安全性考虑,Session的安全性比Cookie要高