目录
前言
前边博客我们学了cookie,浏览器在本地持久化保存数据的一种方案,本篇博客我们将学习session会话机制,服务器端的机制
Cookie
cookie是浏览器在本地持久化保存数据的一种方案,具体使用在前边博客有过讲解
Session
服务器同一时刻收到的请求是很多的,服务器需要清楚地区分每个请求是属于哪个用户的,就需要在服务器这边记录每个用户令牌以及用户的信息的对应关系
核心方法
HttpServletRequest
方法 | 描述 |
HttpSession
getSession()
| 参数填写false时,判定当前会话是否存在,如果不存在,就直接返回null,存在则返回对应的HttpSession对象;参数填写true,判定当前会话是否存在,如果不存在,就创建一个新的键值对,保存到哈希表中,并把生成的sessionId返回到浏览器这里,如果存在,则直接返回对应的HttpSession |
Cookie[]
getCookies()
|
返回一个数组
,
包含客户端发送该请求的所有的
Cookie
对象
.
会自动把Cookie 中的格式解析成键值对
.
|
HttpServletResponse
方法 | 描述 |
void addCookie(Cookie cookie)
|
把指定的
cookie
添加到响应中
.
|
HttpSession
一个HttpSession里边包含多个键值对
方法 | 描述 |
Object getAttribute(String
name)
|
该方法返回在该
session
会话中具有指定名称的对象,如果没
有指定名称的对象,则返回
null.
|
void setAttribute(String
name, Object value)
|
该方法使用指定的名称绑定一个对象到该
session
会话
|
boolean isNew()
|
判定当前是否是新创建出的会话
|
Cookie
方法 | 描述 |
String getName()
|
该方法返回
cookie
的名称。名称在创建后不能改变。
(
这个值是
Set
Cooke
字段设置给浏览器的
)
|
String getValue()
|
该方法获取与
cookie
关联的值
|
void setValue(String
newValue)
|
该方法设置与
cookie
关联的值
|
模拟登陆
1、登录页面,用户可以填写用户名+密码
2、Servlet来处理登录请求
3、使用另一个Servlet来生成主页内容(登陆成功后,跳转到的页面)
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;
/**
* @author krystal
* @date 2022/12/2 10:18
*/
//使用这个类来处理登录请求
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1、从请求中获取到页面提交的用户名和密码
String username=req.getParameter("username");
String password=req.getParameter("password");
// 2. 验证用户名密码是否正确
// 正常这个操作要查数据库. 此处为了简单, 直接写成硬编码了. (把正确的用户名和密码写死了)
// 假定正确的密码是 zhangsan 123
if("zhangsan".equals(username) && "123".equals(password)){
// 登陆成功
// a) 创建一个会话. 用户刚登陆成功, 之前是没有会话的. 重新分配个新的会话给用户.
// getSession
// * 创建 sessionId 和一个 HttpSession 对象
// * 把这两个内容以键值对的形式插入到内存的 哈希表 里
// * 把 sessionId 通过 Set-Cookie 写到响应中.
HttpSession session = req.getSession(true);
// 随意的设置 "键值对" 了. (HttpSession 对象自身也相当于是一个 哈希表)
session.setAttribute("username", "zhangsan");
// b) 让响应重定向到 "主页"
resp.sendRedirect("index");
}else {
//登陆失败
resp.setStatus(403);
resp.setContentType("text/html;charset=utf8");
resp.getWriter().write("登陆失败,用户名或者密码错误!");
}
}
}
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;
/**
* @author krystal
* @date 2022/12/2 10:18
*/
//登陆成功后,要跳转的页面
@WebServlet("/index")
public class IndexServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 首页中也先获取 session, 此处的 session 正是刚才登陆页的时候, 登陆成功的逻辑中创建出来的.
// 此处 参数 写作 false 即可. 表示不新建. 如果不存在, 就返回 null 就是了.
HttpSession session=req.getSession(false);
if (session==null){
resp.setStatus(403);
resp.setContentType("text/html;charset=utf8");
resp.getWriter().write("您尚未登录,不能访问主页");
return;
}
String username=(String)session.getAttribute("username");
resp.setContentType("text/html;charset=utf8");
resp.getWriter().write("欢迎来到主页!"+username);
}
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<form action="login" method="post">
<input type="text" name="username">
<input type="text" name="password">
<input type="submit" value="登陆">
</form>
</body>
</html>
上传文件
核心方法
HttpServletRequest 类方法
方法 | 描述 |
Part getPart(String name)
|
获取请求中给定
name
的文件
|
Collection<Part> getParts()
|
获取所有的文件
|
Part 类方法
方法 | 描述 |
String getSubmittedFileName()
|
获取提交的文件名
|
String getContentType()
|
获取提交的文件类型
|
long getSize()
|
获取文件的大小
|
void write(String path)
|
把提交的文件数据写入磁盘文件
|
package upload;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.IOException;
/**
* @author krystal
* @date 2022/12/2 11:41
*/
@WebServlet("/upload")
@MultipartConfig
public class UploadServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Part part=req.getPart("myfile");
System.out.println(part.getSubmittedFileName());
System.out.println(part.getSize());
System.out.println(part.getContentType());
part.write("D:/wenjian/tmp/result.jpg");
}
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="upload" method="post" enctype="multipart/form-data">
<input type="file" name="myfile">
<input type="submit" value="提交">
</form>
</body>
</html>