cookie&session

Cookie(客户端)

  • Cookie(小甜饼) 是浏览器保存在本地的文本内容
  • Cookie常用于保存登录状态、用户资料等小文本
  • Cookie具有时效性,Cookie内容会伴随请求发送给Tomcat

Servlet/LoginServlet

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package Servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
("/login")
public class extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("用户登录成功");
Cookie cookie=new Cookie("user","admin");
cookie.setMaxAge(60*60*24*7);

resp.addCookie(cookie);
resp.getWriter().println("login success");
}
}

Servlet/indexServlet

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package Servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

("/index")
public class indexServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req,resp);
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//req.getCookies()用户获取所有的Cookie
Cookie[] cs=req.getCookies();
if(cs==null){
System.out.println("not login");
return;
}
String user=null;
for(Cookie c:cs){
System.out.println(c.getName()+":"+c.getValue());
if(c.getName().equals("user")){
user=c.getValue();
break;
}
}
if(user==null){
resp.getWriter().println("user not login");
}else{
resp.getWriter().println("user:"+user);
}
}
}

Cookie的时效性

  • 不设置:即为窗口时效性

Session-用户会话(存在服务器端)

  • Session(用户会话)用于保存与”浏览器窗口”对应的数据
  • Session的数据存储在Tomcat服务器的内存中,具有时效性
  • Session通过浏览器Cookie的SessionId提取用户数据

Servlet/SessionServlet

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package Servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

("/Slogin")
public class SessionServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("登录成功");
//获取到用户会话Session对象
HttpSession session=req.getSession();
String sessionId=session.getId();
System.out.println(sessionId);
session.setAttribute("name","张三");
req.getRequestDispatcher("Sindex").forward(req,resp);
}
}

Servlet/Sessionindex

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package Servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

("/Sindex")
public class Sessionindex extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session=req.getSession();
String name= (String) session.getAttribute("name");
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().println("这是首页,当前用户:"+name);
}
}

Session的原理

ServletContext

  • ServletContext(Servlet上下文对象),是Web应用全局对象
  • 一个Web应用只会创建一个ServletContext对象
  • ServletContext随着Web应用启动而自动创建