Web基础之Cookie对象和Session对象项目实战和对比

来源:互联网 发布:硕士论文修改 淘宝 编辑:程序博客网 时间:2024/06/08 08:54

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"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>商品列表界面</title></head><body style="text-align: center"><table style="margin-top: 50px;margin-left: auto;margin-right: auto;margin-bottom:50px;border: solid 2px #ffeedd;text-align: center;"><caption>商品列表</caption><tr><th>商品名</th><th>商品价格</th><th>操作</th></tr><tr><td>iPhone7Plus</td><td>$400</td><td><a href="/MyCookieAndSession/addGoods?goodsname=iPhone7Plus&goodsprice=$400">加入购物车</a></td></tr><tr><td>iPad Pro</td><td>$200</td><td><a href="/MyCookieAndSession/addGoods?goodsname=iPadPro&goodsprice=$200">加入购物车</a></td></tr><tr><td>Mac Book</td><td>$800</td><td><a href="/MyCookieAndSession/addGoods?goodsname=MacBook&goodsprice=$800">加入购物车</a></td></tr><tr><td>APPLE</td><td>$5</td><td><a href="/MyCookieAndSession/addGoods?goodsname=APPLE&goodsprice=$5">加入购物车</a></td></tr><tr><td colspan="3";style="text-align: right;"><a href="/MyCookieAndSession/showGoods">查看购物车</a></td></tr></table><%String info=(String)request.getAttribute("success");if(info!=null){%><span style="color: red;margin:auto;"><%=info%></span><%}%></body></html>






成功加入购物车的提示信息:




添加到购物车的处理逻辑: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;@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {this.doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {//设置请求编码req.setCharacterEncoding("UTF-8");//获取参数String goodsName=req.getParameter("goodsname");String goodsPrice =req.getParameter("goodsprice");//拿到请求头中所有的CookieCookie[] cookies=req.getCookies();Cookie mycookie=null;//遍历所有的Cookie,看是否有我们想要的Cookieif(cookies!=null &&cookies.length>0){for (Cookie cookie : cookies) {//如果有我们需要的Cookieif("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);//添加Cookieresp.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;@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {this.doPost(req, resp);}@Overrideprotected 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"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>购物车界面</title></head><body><tablestyle="margin-top: 50px; margin-left: auto; margin-right: auto; border: solid 2px #ffeedd; text-align: center;"><caption>我的购物车</caption><tr><th>商品名</th><th>商品价格</th></tr><%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<goodsinfo.length;i++){String goodsName=goodsinfo[i].split("@")[0];String goodsPrice=goodsinfo[i].split("@")[1];%><tr><td><%=goodsName %></td><td><%=goodsPrice %></td></tr><%}}else{out.write("购物车中没有商品!");}%></table></body></html>





查看客户端的Cookie信息:


关闭浏览器再次打开商品展示页面,直接进入购物车,查看购物车中的商品是否还在:
(即使关闭浏览器,购物车中的商品还在)





配置文件:
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">  <display-name>MyCookieAndSession</display-name>  <welcome-file-list>    <welcome-file>index.html</welcome-file>    <welcome-file>index.htm</welcome-file>    <welcome-file>index.jsp</welcome-file>    <welcome-file>default.html</welcome-file>    <welcome-file>default.htm</welcome-file>    <welcome-file>default.jsp</welcome-file>  </welcome-file-list>    <servlet>  <servlet-name>login</servlet-name>  <servlet-class>com.usc.servlet.LoginServlet</servlet-class>  </servlet>  <servlet-mapping>  <servlet-name>login</servlet-name>  <url-pattern>/login</url-pattern>  </servlet-mapping>     <servlet>  <servlet-name>myblog</servlet-name>  <servlet-class>com.usc.servlet.ShowBlogServlet</servlet-class>  </servlet>  <servlet-mapping>  <servlet-name>myblog</servlet-name>  <url-pattern>/blog</url-pattern>  </servlet-mapping>     <servlet>  <servlet-name>addGoods</servlet-name>  <servlet-class>com.usc.servlet.AddGoodsServlet</servlet-class>  </servlet>  <servlet-mapping>  <servlet-name>addGoods</servlet-name>  <url-pattern>/addGoods</url-pattern>  </servlet-mapping>      <servlet>  <servlet-name>showGoods</servlet-name>  <servlet-class>com.usc.servlet.ShowGoodsServlet</servlet-class>  </servlet>  <servlet-mapping>  <servlet-name>showGoods</servlet-name>  <url-pattern>/showGoods</url-pattern>  </servlet-mapping>      <servlet>  <servlet-name>slogin</servlet-name>  <servlet-class>com.usc.servlet.SLoginServlet</servlet-class>  </servlet>  <servlet-mapping>  <servlet-name>slogin</servlet-name>  <url-pattern>/sessionlogin</url-pattern>  </servlet-mapping>       <servlet>  <servlet-name>sshow</servlet-name>  <servlet-class>com.usc.servlet.SessionShowBlogServlet</servlet-class>  </servlet>  <servlet-mapping>  <servlet-name>sshow</servlet-name>  <url-pattern>/sessionblog</url-pattern>  </servlet-mapping></web-app>


上面的购物车实例是基于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技术;我们主要是掌握这两种技术的应用场景以及使用;然后了解两种技术的区别,根据业务场景来选择不同的会话保持技术;
学无止境!共勉!
原创粉丝点击