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,拿到的都是同一个对象。
  

posted on 2020-04-13 23:11  代码吴彦祖  阅读(284)  评论(0编辑  收藏  举报