cookie,session以及application的比较
cookie工作原理:
cookie代码:
1 @WebServlet(value = "/cookie",name = "CookieServlet") 2 public class CookieServlet extends HttpServlet { 3 4 @Override 5 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 6 String username=req.getParameter("username"); 7 String password=req.getParameter("password"); 8 //String expire=req.getParameter("expire");//获取前端传入多久之内自动登录 9 10 //创建cookie对象将我们的用户名以及密码设置到cookie中 11 Cookie usernameCookie=new Cookie("username",username); 12 //给cookie设置过期的时间,其单位是秒 10秒后下面的测试类就拿不到我们的用户名以及密码了 13 usernameCookie.setMaxAge(10); 14 15 Cookie passwordCookie=new Cookie("password",password); 16 passwordCookie.setMaxAge(10); 17 18 //cookie的响应 19 resp.addCookie(usernameCookie); 20 resp.addCookie(passwordCookie); 21 22 } 23 }
浏览器里面的记录:
测试类:
1 @WebServlet(value = "/cookieTest",name = "CookieTestServlet") 2 public class CookieTestServlet extends HttpServlet { 3 @Override 4 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 5 6 //获取所有的cookie的信息 7 Cookie[]cs=req.getCookies(); 8 9 if(cs!=null){ 10 for (Cookie c:cs){ 11 System.out.println(c.getName()+"===="+c.getValue()); 12 } 13 } 14 15 }
后台拿到的记录:
Session(会话)对象出现的原因:是因为HTTP协议是一个无状态的协议。
比如你登录淘宝 当你登录到自己的账号的时候无论你点击哪个标题页面 都会有你的淘宝用户名
流程:
代码:
1 @WebServlet(value = "/session",name = "SessionServlet") 2 public class SessionServlet extends HttpServlet { 3 4 @Override 5 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 6 7 User user=new User(); 8 user.setId(1); 9 user.setName("张三"); 10 11 //通过请求去获取session 12 HttpSession session=req.getSession(); 13 session.setAttribute("user",user); 14 15 } 16 }
然后在每一个servlet里面都加上:
然后在浏览器里面先运行:
把控制台清除,然后访问不同的servlet都可以得到:
还有在浏览器第一次访问session的时候没有 当再访问其他的servlet的时候就会出现sessionID:
注意:如果浏览器关闭后,再打开浏览器访问我们的session那么我们的浏览器会重新弄个sessionID给你,不关浏览器就不会改变。
application:
说白了他在整个服务器就一个值
先在context里面设置我们的用户姓名:
1 @WebServlet(value = "/context",name = "ContextServlet") 2 public class ContextServlet extends HttpServlet { 3 4 @Override 5 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 6 ServletContext servletContext=req.getServletContext(); 7 servletContext.setAttribute("name","王五"); 8 } 9 }
然后再其他的servlet里面获取我们的姓名:
1 /** 2 * 在往后的登录过程中, 登录成功后都会将用户的个人信息放置到session中。 3 */ 4 @WebServlet(value = "/login",name = "LoginServlet") 5 public class LoginServlet extends HttpServlet { 6 7 @Override 8 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 9 10 String username = req.getParameter("username"); 11 String password = req.getParameter("password"); 12 13 // select * from user where username = ? and password = ? 14 User user = new User(); 15 user.setName(username); 16 user.setId(34); 17 18 req.getSession().setAttribute("user", user); 19 20 // 获取全应用唯一的一个 ServletContext类型的对象,单例 21 ServletContext servletContext = req.getServletContext(); 22 System.out.println(servletContext.getAttribute("name")); 23 24 } 25 }
然后在浏览器里面先把context跑起来在运行其他的servlet在后台你会看见:
直接访问我们的jsp页面也可以:
总结:
cookie 是客户端(浏览器)存储。
session是服务器端存储的。
application 是ServletContext类型的对象,全局就唯一一个。无论是通过何种API,拿到的都是同一个对象。