之前的博客中提到,cookie是为了浏览器能够在本地保存数据而产生的机制,是在浏览器工作的。而session则是与之对应的,在客户端工作的。一个服务器对应多个客户端,每个客户端都有自己的session,以sessionId为key,session对象为值,存放在内存的哈希表中
session和cookie相关api
HttpRequest
方法 | 功能 |
---|---|
HttpSession getSession() | 在服务器中获取会话. 参数如果为 true, 则当不存在会话时新建会话; 参数如果为 false, 则当不存在会话时返回 null |
Cookie[] getCookies() | 返回一个数组, 包含客户端发送该请求的所有的 Cookie 对象. 会自动把Cookie 中的格式解析成键值对. |
HttpResponse
方法 | 功能 |
---|---|
void addCookie(Cookie cookie) | 把指定的 cookie 添加到响应中 |
HttpSession类
方法 | 功能 |
---|---|
Object getAttribute(String name) | 返回在该 session 会话中具有指定名称的对象,如果没有指定名称的对象,则返回 null. |
void setAttribute(String name, Object value) | 使用指定的名称绑定一个对象到该 session 会话 |
boolean isNew() | 判定当前是否是新创建出的会话 |
cookie类
方法 | 功能 |
---|---|
String getName() | 返回 cookie 的名称。 |
String getValue() | 获取与 cookie 关联的值 |
void setValue(String newValue) | 设置与 cookie 关联的值。 |
实例
实现用户登陆界面
login.html
使用form表单,实现用户名和密码的post请求提交
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>登陆</title>
</head>
<body>
<form action="login" method="post">
<input type="text" name="username">
<input type="password" name="password">
<input type="submit" value="登陆">
</form>
</body>
</html>
LoginServlet
获取前端提交的username和password,与正确的username和password进行比较,如果正确就创建会话,将username和123的键值对存入哈希表,然后页面重定向到index,
package login;
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;
//使用这个类来处理登陆请求
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
if("123".equals(username) && "1234".equals(password)){
//创建会话
HttpSession session = req.getSession(true);
session.setAttribute("username","123");
resp.sendRedirect("index");
} else {
resp.setStatus(403);
resp.setContentType("text/html; charset=utf8");
resp.getWriter().write("用户名或密码错误!");
}
}
}
IndexServlet
获取session,如果session为空就退出,否则获取哈希表中username对应的值,将其打印在页面上
package login;
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;
//登陆成功后的
@WebServlet("/index")
public class IndexServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//此处是false表示,如果不存在,就不创建,返回空
HttpSession session = req.getSession(false);
resp.setContentType("text/html; charset=utf8");
if(session == null){
resp.getWriter().write("尚未登陆!禁止访问!");
resp.setStatus(403);
return;
}
String username = (String) session.getAttribute("username");
resp.getWriter().write(username + "欢迎回来!");
}
}