javaweb之Session实现简单的购物(URL重写。Cookie重写指定有效日期)和简单的验证结论
2014-03-10 15:44
761 查看
package test.shopping; import java.io.IOException; import java.io.PrintWriter; import java.io.Serializable; import java.util.LinkedHashMap; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; //代表网站首页,列出所有书 public class ListBookServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding("UTF-8"); response.setHeader("Content-type", "text/html;charset=UTF-8"); // 拿到session,这次也是创建session request.getSession(); PrintWriter out = response.getWriter(); out.print("本网站有如下商品:<br />"); // 拿到所有商品 Map<String, Book> map = Db.getAll(); // 遍历存有数据信息的“数据库”显示到页面中 for (Map.Entry<String, Book> entry : map.entrySet()) { Book book = entry.getValue(); // 点击超链接后,在新的页面打开target="_blank" // 为了防止Cookie被禁用后还可以用Session实现记录购买的商品,采用URL重写 String url = response.encodeURL("/day07/servlet/BuyServlet?id=" + book.getId()); out.print(book.getName() + "<a href='" + url + "' target='_blank'>购买</a><br />"); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } // 模拟数据库,从这个类中提取书的信息 class Db { // 实际开发中存储数据的集合有检索数据的需求,都用双列的(map),如果没有检索数据需求,用单列的(list、set) // LinkedHashMap是有序存储 private static Map<String, Book> map = new LinkedHashMap<String, Book>(); // 对书进行静态初始化 static { // key是商品的id,value是商品,商品中也是有商品的id的 map.put("1", new Book("1", "javaweb开发", "老张", "一本好书!")); map.put("2", new Book("2", "jdbc开发", "老张", "一本好书!")); map.put("3", new Book("3", "spring开发", "老黎", "一本好书!")); map.put("4", new Book("4", "struts开发", "老毕", "一本好书!")); map.put("5", new Book("5", "android开发", "老黎", "一本好书!")); } public static Map<String, Book> getAll() { return map; } } // 模拟书类,因为程序中要存储这个类,所以实现Serializable这个标记接口 class Book implements Serializable { private String id; private String name; private String author; private String description; public Book() { super(); } public Book(String id, String name, String author, String description) { super(); this.id = id; this.name = name; this.author = author; this.description = description; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } }
package test.shopping; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; //购买页面 public class BuyServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取购买的书的id String id = request.getParameter("id"); Book book = Db.getAll().get(id); // 将购买的书存到session中,因为首页中已经创建过一次session了,所以不用创建了 HttpSession session = request.getSession(false); // 如果是直接访问的这个页面,那么根据设计,这个页面就被泄漏了,转到首页把 if (session == null) { response.sendRedirect(request.getContextPath() + "/servlet/ListBookServlet"); } // 手工以cookie的形式发送sessionId,以解决关闭浏览器后,购买的商品还在 String sessionId = session.getId(); Cookie cookie = new Cookie("JSESSIONID", sessionId); // 记住这个session30分钟 cookie.setMaxAge(60 * 30); cookie.setPath(request.getContextPath()); response.addCookie(cookie); // 因为用户要购买很多本书,所以这个将购买的书存入session中,存入的是一个集合,否则要存好多对 // 但是在这里不能直接创建那个集合,否则每次创建的话,每次购买都是新的集合 List<Book> list = (List<Book>) session.getAttribute("list"); if (list == null) { list = new ArrayList<Book>(); session.setAttribute("list", list); } list.add(book); // 这里是绝对不可以用转发的,因为用转发刷新一次购买一个,刷新一次,购买一个(转发是个服务器看的) // request.getRequestDispatcher("/servlet/ListCartServlet").forward(request, // response); // 要用重定向(转发是给浏览器看的)但是这个/day07也不能写死,开发的时候叫day07,部署的时候就有可能叫test // response.sendRedirect("/day07/servlet/ListCartServlet"); // //request.getContextPath()得到/项目名 // 这里也要URL重写,防止客户端关闭Cookie。response.sendRedirect()方法的URL重写要调用response.encodeRedirectURL String url = response.encodeRedirectURL(request.getContextPath() + "/servlet/ListCartServlet"); response.sendRedirect(url); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
package test.shopping; import java.io.IOException; import java.io.PrintWriter; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; //显示用户购买的商品 public class ListCartServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding("UTF-8"); response.setHeader("Content-type", "text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); // 因为session已经创建过了,所以这里调用带参数的方法,不要再创建session,否则用户直接访问这个页面也会创建session HttpSession session = request.getSession(false); if (session == null) { out.print("对不起,您还没有购买任何商品"); return; } out.print("您购买了如下商品:<br />"); List<Book> list = (List<Book>) session.getAttribute("list"); for (Book book : list) { out.print(book.getName() + "<br />"); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } /* * 经验证当用户关闭Cookie时,采用URL重写的方式是无法通过重新开的浏览器获取到原来浏览器窗口中的session的, * 但是如果Cookie没有关闭,采用URL重写的方式第一次是采用重写,第二次就不采用了,是可以通过重新开的浏览器窗口获取到原来浏览器窗口中的session的 */ // 关闭Cookie后,浏览器是不阻止localhost这个地址的Cookie的,和电脑的机器环境有关。
相关文章推荐
- javaWeb_08-用session实现简单的购物
- java web中图片验证码功能的简单实现方法
- 简单的Java Web项目(2)——session实现简单的购物车
- java web session+cookie实现用户自动登录
- Servlet实现禁用cookie重写URL获取session
- 关于session的实现:cookie与url重写
- 关于session的实现:cookie与url重写
- 【Java.Web】Session —— 示例 —— JSP —— 登陆功能及重写URL
- java-web京东购物网 加入购物车与查看购物车的实现运用session服务器端(在数据库中查询)
- JavaWeb_06_session_简单购物
- java web-如何实现IE禁用cookie后继续使用session
- 重写System.Web.UI.Page中OnLoad事件实现Session验证
- 用jsp实现一个简单的购物车web应用系统。实现的添加购物商品,删除购物商品并且显示购物车信息。
- 【《深入解析Java Web技术内幕》学习思维导图】第10章 深入理解Session和Cookie
- 【简记】Java Web 内幕——Cookie与Session深度解析
- 玩转web之servlet(六)---session介绍及简单使用(登录验证中保存信息)
- java web 程序---登陆验证注销/重定向session_login.jsp/
- java_web初学笔记之<Session与Cookie>
- JavaWeb开发使用Cookie创建-获取-持久化、自动登录、购物记录、作用路径
- java实现最简单的web聊天室程序源代码,适合初学者