##场景 在WEB开发中,服务器中能够为每一个用户浏览器建立一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认状况下),当浏览器访问其它程序时,其它程序能够从用户的session中取出该数据,为用户服务。 session和cookie的主要区别在于: cookie技术是把用户的数据写给用户的浏览器 session技术把用户的数据写到用户独占的session中 session对象由服务器建立,开发人员能够调用request对象的getSession方法获得session对象。html
request.getSession(false) 只获取,不建立web
##session的实现原理 ###原理 session是基于cookie的session是一个没有设定maxAge的cookie浏览器
###如何防止关闭浏览器后存储的用户信息被删除 思路:向客户端回写一个名称与session相同的cookie覆盖,并设定maxAge服务器
HttpSession session = request.getSession(); String sessionId = session.getId() Cookie cookie = new Cookie("JSESSIONID",sessionId); cookie.setPath(requst.getContextPath()); cookie.setMaxAge(30*60); session.setAttribute("name","洗衣机");
##session的工做原理 ###用户浏览器禁用cookie的解决方案cookie
response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); PrintWriter pw = response.getWriter(): request.getSession(); String url1 = response.encodeURL("/test-web/servlet/sessionDemo1"); String url2 = response.encodeURL("/test-web/servlet/sessionDemo2"); pw.print("<a href='"+url1+"'>购买</a><br/><a href="'" + url2 + "'>收藏</a>"); //response.encodeURL()方法将自动判断浏览器是否禁用cookie,若禁用,则重写URL,后面拼接JSESSIONID
##用session完成简单的购物session
public class ListAllServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); HttpSession session = request.getSession(); PrintWriter pw = response.getWriter(); pw.print("本网站有以下商品: <br/>"); Map<Integer, Book> map = Db.getAll(); Set<Entry<Integer, Book>> entrySet = map.entrySet(); for (Entry<Integer, Book> entry : entrySet) { Book book = entry.getValue(); String url = response.encodeURL("/test-web/BuyServlet?id=" + book.getId()); pw.print(book.getName() + "<a href='" + url + "' target=_blank>购买</a><br/>"); } pw.print("当前已经购买了:<br/>"); List<Book> list = (List<Book>) session.getAttribute("list"); if (list != null) { for (Book book : list) { if(book!=null){ pw.print(book.getName()+"<br/>"); } } } } }
public class BuyServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String id = request.getParameter("id"); Book book = Db.getAll().get(Integer.valueOf(id)); HttpSession session = request.getSession(false); List list = (List) session.getAttribute("list"); if (list == null) { list = new ArrayList<Book>(); } list.add(book); session.setAttribute("list", list); String url = request.getContextPath() + "/ListAllServlet"; url = response.encodeRedirectUrl(url); response.sendRedirect(url); // 此处用rediret 防止刷新再次购买 } }