都是用来解决HTTP的无状态问题,由于HTTP每一次请求都相当于不同的用户向服务器发送请求。HTTP协议无法记住浏览器端是不是同一个用户。Cookie和Session都是为了解决一个用户的多次请求之间数据的共享问题,只是实现原理不同,只能实现一个用户多个请求之间的数据共享。
当浏览器的Cookie的过期时间还没到时,如果浏览器没有清空Cookie,那么就算关掉浏览器,Cookie也依然存在。
<session-config> <session-timeout>30</session-timeout> </session-config>
session.setMaxInactiveInterval(10);
即使使用了req.getSession().setMaxInactiveInterval(1000);
设置了session的过期时间,浏览器在关闭时,也会清空session的Cookie。这个设置过期时间是针对服务器端的,到了过期时间,服务器就会销毁该session。
- Cookie :记住我、网页皮肤、最近浏览商品 - Session:登录的用户信息、购物车(也可以用Cookie)
package com.it.servlet; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet(urlPatterns = "/Login") public class LoginServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String username = req.getParameter("username"); String password = req.getParameter("password"); String readme = req.getParameter("readme"); // 判断用户名和密码是否为空 if("".equals(username) || "".equals(password)){ req.setAttribute("errorMsg","用户名和密码不能为空!"); req.getRequestDispatcher("/index.jsp").forward(req, resp); return; } //1、创建Cookie Cookie cookie1 = new Cookie("username", username); Cookie cookie2 = new Cookie("password", password); // 2、设置Cookie的访问规则, / 当前服务器有效,req.getContextPath() 当前项目有效 cookie1.setPath("/"); cookie2.setPath("/"); // 如果用户点击了readme,则设置Cookie的过期时间为1小时 if(readme != null) { // 3、设置过期时间为1个小时 cookie1.setMaxAge(60 * 60); cookie2.setMaxAge(60 * 60); }else { // 未点击readme,将cookie时间直接设置为过期 cookie1.setMaxAge(0); cookie2.setMaxAge(0); } // 4、响应给浏览器 resp.addCookie(cookie1); resp.addCookie(cookie2); //5、跳转到登录成功页面 resp.sendRedirect(req.getContextPath() + "/success.jsp"); } }
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <!DOCTYPE html> <html lang="zh-CN"> <head> <% String path = request.getContextPath(); String username = ""; String password = ""; // 如果Cookie中没有值,则为空,有值的话设置为checked,让记住我的按钮动态选中 String readme = ""; Cookie[] cookies = request.getCookies(); if (cookies!=null) { for (Cookie cookie : cookies) { if (cookie.getName().equals("username")) { username = cookie.getValue(); readme = "checked"; } if (cookie.getName().equals("password")) { password = cookie.getValue(); } } } %> <base href="<%=path%>/"> </head> <body> <center> <form action="Login"> <p>用户名:<input type="text" name="username" value="<%=username%>"></p> <p>密码:<input type="text" name="password" value="<%=password%>"></p> <p><input type="checkbox" name="readme" <%=readme%> >记住我</p> <p><input type="submit" value="点击登录"></p> </form> </center> </body> </html>
// Servlet的service方法中设置值 req.getSession().setAttribute("username",username); // jsp中获取值,2种方式 sessionId为:<%=session.getId()%> 用户名为:${sessionScope.username} 用户名为:<%=session.getAttribute("username")%>