前言
记得在校招的时候总是会问及怎样解决http的无状态问题,其实自己知道有隐藏表单,cookie,令牌,session等技术可是具体的流程及由来,还有应用我是一脸懵逼的。。。
大纲
- Cookie概述
- Cookie使用的三个步骤
- Cookie的机制
- Cookie的安全问题
- Session概述
- Session使用的四个步骤
- Session跟踪机制
- Session总结
Cookie概述
cookie 是当你浏览每个网站时,由WEB服务器置于你硬盘上的一个非常小的文本文件,它可以记录你的用户ID号、密码、浏览过的网页、停留的时间等等。
服务器通过cookie的响应头将cookie发送给客户机,其形式为名称=值
客户机则以文件的形式将cookie存放在本地硬盘上,具体存储位置与浏览器相关
HTTP/1.1 200 OK
Set-Cookie:CustomerID=1234;domain=abc.com;path=/sales
使用Cookie
创建cookie对象:
Cookie color = new Cookie(“color”,”red”);
在响应中加入cookie:
response.addCookie(color);
通过request取回cookie
Cookie[] cookie = request.getCookies();
示例:记录用户访问次数
Cookie[] c = request.getCookies();
int count = 1;
if(c!=null) {
for(int i=0;i<c.length;i++) {
Cookie accountCookie = c[i];
if(accountCookie.getName().equals("accountCount")) {
count = Integer.parseInt(accountCookie.getValue())+1;
break;
}
}
}
response.addCookie(new Cookie("accountCount",String.valueOf(count)));
具体来说Cookie机制是采用的是在客户端保持状态的方式,它是在客户端的会话状态的储存机制,它需要用户打开客户端的cookie支持。Cookie的作用就是为了解决HTTP无状态的缺陷所作的努力。
Session概述
HTTP 协议特点:无状态协议每个客户端请求,对服务器而言都是新的服务器不记住客户端的任何信息这样的协议适用于在web上快速获取信息,同时,HTTP协议不支持维护客户机状态。在线购物特点:服务器应能识别出每个客户的不同的购物车
- 会话:会话(浏览器与服务器之间的交互)是在指定阶段来自同一客户的一系列的HTTP请求
- 会话跟踪:将一个请求与会话关联的过程
- 会话管理:对容器要求识别来自同一客户的请求维护每个客户的状态
会话管理技术
一般原理:会话唯一标识:sessionID
常用技术
- Cookie
- 隐藏表单域:<input type=“hidden” name=“sessionID” value=“…”/>
- url重写:http://localhost:8080/myapp/ServletA?sessionID=......
- 使用session进行会话管理
Session使用的四个步骤
- 获得
- 获取属性
- 设置属性
获得Session对象
通过request对象获取Session对象
HttpSession session = request.getSession();
容器:
1、Servlet通知容器,它需要Session对象;
2、容器创建sessionID,它是客户这次会话的唯一标识;
3、容器创建HttpSession对象,Servlet获得这个对象
利用Session存取数据
通过Session对象来存取数据
Session.setAttribute(“name”,value)
Session.getAttribute(“name”)
容器:
1、在Session对象中保存数据,可以传递给同一个系统的其他Servlet或者是页面。
2、不同的客户端同时访问时,根据sessionId来自动获取Session中保存的数据。
3、HttpSession对象中只能保存Object类型的数据。
Session销毁与失效
Session.invalidate();
Session.setMaxIncativeInterval(Interva);
容器:
1、调用上述的方法,可以手动的是一个Session对象销毁。
2、每一个Session对象都是在服务器端运行的,默认有效的时间为30分钟。
3、可以通过代码或者配置来指定Session有效的时间。
会话超时阶段
定义:来自参与会话的客户机的两个连续请求之间的最长允许空闲时间称为会话超时阶段
<session-config>
<session-timeout>10</session-timeout>
</session-config>
session.setMaxInactiveInterval(10);
单位分钟
HttpSession 接口
Session接口
setAttribute(String, Object)
getAttribute(String)
getID();
getMaxInactiveInterval()
setMaxInactiveInterval(int)
isNew()
invalidate()
getAttributeNames() –Enumeration
将放入的值所对应的Name都取出来
removeAttribute(String name)
Session示例
登录
Index Servlet及LoginAction Servlet
//在LoginAction中:
//根据用户名与密码,查找用户是否合法
if(合法) {
User user = …;
HttpSession session = request.getSession();
session.setAttribute(“user”,user);
}else {
//让用户重新登录
}
//在index中
HttpSession session = request.getSession();
User user = (User) session.getAttribute(“user”);
if( user != null) {//用户已登录成功
//转向显示用户信息页面
}else{
//转向用户登录页面
}
购物车设计
货物项:CatalogItem
项目订单:ItemOrder
购物车:ShoppingCart
public class CatalogItme {
String itemID; String name; String desc; double cost;
}
public class ItemOrder {
CatalogItem item; int numItems;
}
public class ShoppingCart {
List<ItemOrder> itemsOrdered;
public void addItem(String itemId) {}
public void removeItem(String itemId) {}
public void setNumOrdered(String itemId,int numOrdered){}
}
addItem
public void addItem(String itemID){
for(int i=0;i<itemOrdered.size();i++) {
order = (ItemOrder) itemOrdered.get(i);
if(order.getItemID().equals(itemID) {
ItemOrder order.incrementNumItems();
return;
}
}
//新物品项
ItemOrder newOrder = Catalog.getItem(itemID);
itemOrdered.add(newOrder);
}
购物车前端实现
显示货物的列表页面,当点击”加入购物车时”,进入显示当前订单页面
当前订单页面OrderPage
//关键代码示例
HttpSession session = request.getSession();
ShoppingCart cart = (ShoppingCart) session.getAttribute(“soppingCart”);
if(cart==null) {
cart = new ShoppingCart();
session.setAttribute(“shoppingCart”,cart);
}
//获得ItemID,
String itemID = request.getParameter(“itemID”);
//调用addItem方法
Cart.addItem(itemID);
//显示购物车中的所有订单
List itemsOrder = cart.getItemsOrdered();
for(…) {…}
总结
- 理解并掌握Cookie机制
- 理解并掌握Session机制
- 使用Session传递数据,进行会话跟踪