作者:世卍界创意驿站肀 | 来源:互联网 | 2023-08-19 11:25
本文由编程笔记#小编为大家整理,主要介绍了5.Servlet的COOKIE和Session相关的知识,希望对你有一定的参考价值。
一.会话
两种技术:
COOKIE:客户端技术
Session:服务器技术
常见应用:网站登录之后下一次就可以不再登录。
1.COOKIE
使用步骤:
服务器从客户端获取COOKIE信息
服务器设置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 ) {
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
注意事项:
一个COOKIE只能保存一个信息
一个web站点可以给浏览器发送多个COOKIE但是最多存放20个COOKIE
COOKIE大小限制为4kb
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的自动失效时间