5.Servlet的Cookie和Session

Posted zhihaospace

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了5.Servlet的Cookie和Session相关的知识,希望对你有一定的参考价值。

一.会话

两种技术:

  • Cookie:客户端技术

  • Session:服务器技术

常见应用:网站登录之后下一次就可以不再登录。

1.Cookie

使用步骤:

  1. 服务器从客户端获取cookie信息

  2. 服务器设置cookie信息返回给客户端

Cookie案例:服务器获取并设置cookie

 1 public class CookieDemo01 extends HttpServlet {
 2 
 3     @Override
 4     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
 5         req.setCharacterEncoding("utf-8");
 6         resp.setCharacterEncoding("utf-8");
 7         resp.setContentType("text/html; charset=utf-8");
 8 
 9         PrintWriter out = resp.getWriter();
10 
11         //服务器从客户端获取cookie
12         Cookie[] cookies = req.getCookies();
13 
14         if (cookies != null) {
15             out.write("你上一次访问的时间是:");
16 
17             for (int i = 0; i < cookies.length; i++) {
18                 Cookie cookie = cookies[i];
19 
20                 //判断cookie的名字
21                 if (cookie.getName().equals("lastLoginTime")) {
22                     //获取cookie的值
23                     long lastLoginTime = Long.parseLong(cookie.getValue());
24 
25                     Date date = new Date(lastLoginTime);
26 
27                     out.write(date.toLocaleString());
28                 }
29             }
30         } else {
31             out.write("这是您第一次访问");
32         }
33 
34         //服务器给客户端响应一个cookie
35         Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + "");
36 
37         //设置cookie的有效期为1天
38         cookie.setMaxAge(24 * 60 * 60);
39         resp.addCookie(cookie);
40     }
41 
42     @Override
43     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
44         doGet(req, resp);
45     }
46 }

cookie常用函数:

1 Cookie[] cookies = req.getCookies(); //获取cookie
2 cookie.getName();                   // 获取cookie的key
3 cookie.getValue();                  //获取cookie的value
4 new Cookie("lastLoginTime", System.currentTimeMillis() + "");//新建一个cookie
5 cookie.setMaxAge(24 * 60 * 60);     //设置cookie的有效期
6 resp.addCookie(cookie);             //浏览器返回给客户端一个cookie

注意事项:

  1. 一个Cookie只能保存一个信息

  2. 一个web站点可以给浏览器发送多个cookie但是最多存放20个cookie

  3. Cookie大小限制为4kb

  4. 300个cookie是浏览器的上限

删除Cookie:

  • 方法1:不设置cookie的有效期,关闭浏览器后cookie自动失效

  • 方法2:设置浏览器有效期为0

删除cookie时,必须先建立一个和需要删除的cookie有一样的键值的cookie

1 //服务器给客户端响应一个cookie
2 Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + "");
3 
4 //设置cookie的有效期为1天
5 cookie.setMaxAge(24 * 60 * 60);
6 resp.addCookie(cookie);

对于中文乱码问题:使用编码和解码

1 cookie = new Cookie("name",URLEncoder.encode("你好!","utf-8"))
2 out.write(URLDecoder.decode(cookie.getValue(),"utf-8"));

2.Session(重点)

(1)什么是Session

  • 服务器会给每一个用户(浏览器)创建一个Session对象

  • 一个session独占一个浏览器,只要浏览器没有关闭,这个Session就一直存在

  • 用户登录之后,整个网站都可以访问这个Session(用于保存用户信息,保存购物车的信息)

(2)Session和cookie的区别

  • Cookie:服务器将数据保存在浏览器上,浏览器保存,可创建多个

  • Session:服务器将数据保存在服务器上用户独占Session,只有一个

(3)Session的使用场景

  • 保存一个登录用户的信息

  • 保存购物车信息

  • 保存在整个网站中经常使用的数据

(4)使用:

SessionDemo01:获得和设置Session

 1 public class SessionDemo01 extends HttpServlet {
 2 
 3     @Override
 4     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
 5         //解决中文乱码问题
 6         req.setCharacterEncoding("utf-8");
 7         resp.setCharacterEncoding("utf-8");
 8         resp.setContentType("text/html; charset=utf-8");
 9 
10 
11         //得到Session
12         HttpSession session = req.getSession();
13 
14 
15         //设置Session
16         session.setAttribute("name",new Person("小王",24));
17 
18         //获取Session的ID
19         String sessionId = session.getId();
20 
21         //判断session是不是新建的
22         if (session.isNew()){
23             resp.getWriter().write("session创建成功,ID:"+sessionId);
24         }else{
25             resp.getWriter().write("session已经在服务器中存在,ID:"+sessionId);
26         }
27 
28 
29 
30     }
31 
32     @Override
33     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
34         doGet(req, resp);
35     }
36 }

SessionDemo02:跨Servlet访问Session

 1 public class SessionDemo02 extends HttpServlet {
 2 
 3     @Override
 4     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
 5 
 6         //解决中文乱码问题
 7         req.setCharacterEncoding("utf-8");
 8         resp.setCharacterEncoding("utf-8");
 9         resp.setContentType("text/html; charset=utf-8");
10 
11         //得到Session
12         HttpSession session = req.getSession();
13 
14         Person person = (Person) session.getAttribute("name");
15 
16         resp.getWriter().write("获得person:" + person);
17     }
18 
19     @Override
20     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
21         doGet(req, resp);
22     }
23 }

SessionDemo03:手动删除Session

 1 public class SessionDemo03 extends HttpServlet {
 2 
 3     @Override
 4     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
 5         HttpSession session = req.getSession();
 6 
 7         session.removeAttribute("name");
 8 
 9         //手动注销Session:注销之后就没有之前的那个Session但是会立即创建一个新的Session
10         session.invalidate();
11     }
12 
13     @Override
14     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
15         doGet(req, resp);
16     }
17 }

也可以在web.xml中设置Session的自动失效时间

1 <!--设置15分钟后Session自动失效-->
2 <session-config>
3   <session-timeout>15</session-timeout>
4 </session-config>

 

以上是关于5.Servlet的Cookie和Session的主要内容,如果未能解决你的问题,请参考以下文章

session和cookie的区别

session和cookie的区别是啥?

简述cookies和session的区别

Session和Cookie

Token是啥?和session、cookie相比,使用场景有啥区别?

cookie、session、redis实现单点登录