您的位置:首页 > 其它

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

2017-06-28 14:37 615 查看
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;

@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"%>
<!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>
<table
style="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技术;我们主要是掌握这两种技术的应用场景以及使用;然后了解两种技术的区别,根据业务场景来选择不同的会话保持技术;
学无止境!共勉!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: