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
成功加入购物车的提示信息:
添加到购物车的处理逻辑:AddGoodsServlet.java
跳转到购物车的逻辑:ShowGoodsServlet.java
显示购物车中商品信息:shoppingCar.jsp
查看客户端的Cookie信息:
关闭浏览器再次打开商品展示页面,直接进入购物车,查看购物车中的商品是否还在:
(即使关闭浏览器,购物车中的商品还在)
配置文件:
上面的购物车实例是基于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技术;我们主要是掌握这两种技术的应用场景以及使用;然后了解两种技术的区别,根据业务场景来选择不同的会话保持技术;
学无止境!共勉!
一、项目背景:
描述:早期电商网站,在不登录的情况下,能够保存商品到购物车,并且在近期再次进入该网站,还能看到购物
车中的商品,这是如何实现呢?
二、项目分析:
购物车主要是能在一定时间内记住用户选择的商品;这和我们学习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技术;我们主要是掌握这两种技术的应用场景以及使用;然后了解两种技术的区别,根据业务场景来选择不同的会话保持技术;
学无止境!共勉!
相关文章推荐
- Flask零基础到项目实战(六)cookie和session--操作session(二)
- Flask零基础到项目实战(六)cookie和session(一)
- JavaWeb基础---Cookie和Session
- Web基础之Servlet+JDBC+JSP项目实战记录(一)
- JavaWeb基础——Cookie和Session
- javaWeb基础知识----Cookie,Session
- Flask零基础到项目实战(七)请求方法、g对象和钩子函数
- IT咨询顾问:一次吐血的项目救火 java或判断优化小技巧 asp.net core Session的测试使用心得 【.NET架构】BIM软件架构02:Web管控平台后台架构 NetCore入门篇:(十一)NetCore项目读取配置文件appsettings.json 使用LINQ生成Where的SQL语句 js_jquery_创建cookie有效期问题_时区问题
- Vue2+VueRouter2+Webpack+Axios 构建项目实战(一)基础知识概述
- JavaWeb项目为什么我们要放弃原生tomcat的session/cookie机制?
- Web基础之Servlet+JDBC+JSP项目实战记录(三)
- QX项目实战-11.基础架构试验二:反序列化对象、重写数据库
- Web基础之Request对象和Response对象项目实战
- Web基础之Cookie对象与Session对象(一)
- Web基础(7)Tornado、Cookie、Session、Ajax、文件上传
- Python爬虫开发与项目实战 2:Web前端基础
- Java基础 web-cookie与session
- Web基础之Servlet+JDBC+JSP项目实战终结篇
- Web基础之Servlet+JDBC+JSP项目实战记录(二)
- Web基础之Cookie对象与Session对象(二)