一.会话
两种技术:
-
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 < 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
注意事项:
-
一个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的自动失效时间
1 <!--设置15分钟后Session自动失效-->
2 <session-config>
3 <session-timeout>15</session-timeout>
4 </session-config>