Web基础之Cookie对象和Session对象项目实战和对比
一、项目背景:
描述:早期电商网站,在不登录的情况下,能够保存商品到购物车,并且在近期再次进入该网站,还能看到购物
车中的商品,这是如何实现呢?
二、项目分析:
购物车主要是能在一定时间内记住用户选择的商品;这和我们学习Cookie和Session的生效时间对应起来;那么具体该如何实现购物车功能呢?
三、项目思路:
为模拟购物车功能,我们需要一个展示商品列表的页面,并且能添加对应的商品到购物车中,当成功添加时,应该有提示信息,提示加入购物车成功,当点击显示购物车时,需要能展示购物车中的商品;
gooList.jsp--->商品展示页面
AddGoodsServlet.java---->处理加入购物车的逻辑
ShowGoodsServlet.java---->处理跳转到购物车中商品的逻辑
shoppingCar.jsp--->展示购物车中的商品
当第一次请求加入购物车时,创建一个Cookie,把商品信息存入到Cookie中,并设置Cookie的有效期为一天(可以根据需要自己设置)当下一次再次有商品再次加入到购物车时,更新Cookie的值;并重新设置Cookie的有效期为一天;显示购物车中的商品时,先获取所有的请求求,看是否有我们需要的请求头,如果有,从该请求头中获取我们所需要的信息,然后展示出来;
四、项目源代码以及运行效果:
商品展示页面:goodsList.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
商品列表界面
<%
String info=(String)request.getAttribute("success");
if(info!=null){
%>
<%=info%>
<%
}
%>
成功加入购物车的提示信息:
添加到购物车的处理逻辑:AddGoodsServlet.java
package com.usc.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class AddGoodsServlet extends HttpServlet{
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//设置请求编码
req.setCharacterEncoding("UTF-8");
//获取参数
String goodsName=req.getParameter("goodsname");
String goodsPrice =req.getParameter("goodsprice");
//拿到请求头中所有的Cookie
Cookie[] cookies=req.getCookies();
Cookie mycookie=null;
//遍历所有的Cookie,看是否有我们想要的Cookie
if(cookies!=null &&cookies.length>0){
for (Cookie cookie : cookies) {
//如果有我们需要的Cookie
if("goodList".equals(cookie.getName())){
mycookie=cookie;
// 测试代码,请忽略
// int age1=cookie.getMaxAge();
// int age2=mycookie.getMaxAge();
// String test=cookie.getValue();
// 那么更新Cookie中的值,并重新设置有效期
cookie.setValue(cookie.getValue()+"#"+goodsName+"@"+goodsPrice);
cookie.setMaxAge(24*3600);
// 测试代码,请忽略
// String infos=cookie.getValue();
//添加请求头
resp.addCookie(cookie);
// 成功加入购物车
req.setAttribute("success", goodsName+"成功加入购物车!");
break;
}
}
}
// 如果没有我们需要的Cookie,那么创建我们需要的Cookie
if(mycookie==null){
mycookie = new Cookie("goodList", goodsName+"@"+goodsPrice);
// 设置Cookie的有效期
mycookie.setMaxAge(24*3600);
// 添加Cookie
resp.addCookie(mycookie);
// 成功加入购物车
req.setAttribute("success", goodsName+"成功加入购物车!");
}
// 请求转发
req.getRequestDispatcher("/goodList.jsp").forward(req, resp);
}
}
跳转到购物车的逻辑:ShowGoodsServlet.java
package com.usc.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ShowGoodsServlet extends HttpServlet{
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//设置请求编码
req.setCharacterEncoding("UTF-8");
// Cookie[] cookies=req.getCookies();
// if(cookies!=null &&cookies.length>0){
// for (Cookie cookie : cookies) {
// if("goodList".equals(cookie.getName())){
// String values=cookie.getValue();
// req.setAttribute("goodsinfo", values);
// break;
// }
// }
// }
req.getRequestDispatcher("/shoppingCar.jsp").forward(req, resp);
}
}
显示购物车中商品信息:shoppingCar.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
购物车界面
我的购物车
商品名 |
商品价格 |
<%
String values=null;
Cookie[] cookies=request.getCookies();
if(cookies!=null &&cookies.length>0){
for (Cookie cookie : cookies) {
if("goodList".equals(cookie.getName())){
values=cookie.getValue();
break;
}
}
}
if(values!=null){
String goodsinfo[]=values.split("#");
for(int i=0;i
<%=goodsName %> | <%=goodsPrice %> |
<%
}
}else{
out.write("购物车中没有商品!");
}
%>
查看客户端的Cookie信息:
关闭浏览器再次打开商品展示页面,直接进入购物车,查看购物车中的商品是否还在:
(即使关闭浏览器,购物车中的商品还在)
配置文件:
MyCookieAndSession
index.html
index.htm
index.jsp
default.html
default.htm
default.jsp
login
com.usc.servlet.LoginServlet
login
/login
myblog
com.usc.servlet.ShowBlogServlet
myblog
/blog
addGoods
com.usc.servlet.AddGoodsServlet
addGoods
/addGoods
showGoods
com.usc.servlet.ShowGoodsServlet
showGoods
/showGoods
slogin
com.usc.servlet.SLoginServlet
slogin
/sessionlogin
sshow
com.usc.servlet.SessionShowBlogServlet
sshow
/sessionblog
上面的购物车实例是基于Cookie实现的,我们也可以通过Session实现,实现思路差不多,这里不再赘述;基本思路如下:
五、Cookie和Session的对比:
总的来说:cookie机制采用的是在客户端保持状态的方案,session是一种服务器端保持的机制
存取方式的不同
Cookie中只能保管ASCII字符串,假如需求存取Unicode字符或者二进制数据,需求先进行编码。Cookie中也不能直接存取Java对象。若要存储略微复杂的信息,运用Cookie是比拟艰难的。
而Session中能够存取任何类型的数据,包括而不限于String、Integer、List、Map等。Session中也能够直接保管Java Bean乃至任何Java类,对象等,运用起来十分便当。能够把Session看做是一个Java容器类。
隐私策略的不同
Cookie存储在客户端阅读器中,对客户端是可见的,客户端一些程序可能会窥探、复制以至修正Cookie中的内容。
而Session存储在服务器上,对客户端是透明的,不存在敏感信息泄露的风险。
假如选用Cookie,比较好的方法是,敏感的信息如账号密码等尽量不要写到Cookie中。最好是像Google、Baidu那样将Cookie信息加密,提交到服务器后再进行解密,保证Cookie中的信息只要本人能读得懂。
而假如选择Session就省事多了,反正是放在服务器上,Session里任何隐私都能够有效的保护。
有效期上的不同
使用过Google的人都晓得,假如登录过Google,则Google的登录信息长期有效。用户不用每次访问都重新登录,Google会持久地记载该用户的登录信息。要到达这种效果,运用Cookie会是比较好的选择。只需要设置Cookie的过期时间属性为一个很大很大的数字。
由于Session依赖于名为JSESSIONID的Cookie,而Cookie JSESSIONID的过期时间默许为–1,只需关闭了阅读器该Session就会失效,因而Session不能完成信息永世有效的效果。运用URL地址重写也不能完成。而且假如设置Session的超时时间过长,服务器累计的Session就会越多,越容易招致内存溢出。
服务器压力的不同
Session是保管在服务器端的,每个用户都会产生一个Session。假如并发访问的用户十分多,会产生十分多的Session,耗费大量的内存。因而像Google、Baidu、Sina这样并发访问量极高的网站,是不太可能运用Session来追踪客户会话的。
而Cookie保管在客户端,不占用服务器资源。假如并发阅读的用户十分多,Cookie是很好的选择。关于Google、Baidu、Sina来说,Cookie或许是唯一的选择。
浏览器支持的不同
Cookie是需要客户端浏览器支持的。假如客户端禁用了Cookie,或者不支持Cookie,则会话跟踪会失效。关于WAP上的应用,常规的Cookie就派不上用场了。
假如客户端浏览器不支持Cookie,需要运用Session以及URL地址重写。需要注意的是一切的用到Session程序的URL都要进行URL地址重写,否则Session会话跟踪还会失效。
六、总结
通过这段时间的学习,我们主要学习了两种会话保持技术,一种是客户端会话保持技术,即Cookie技术,另一种是服务器端会话保持技术,即Session技术;我们主要是掌握这两种技术的应用场景以及使用;然后了解两种技术的区别,根据业务场景来选择不同的会话保持技术;
学无止境!共勉!