💐1.http请求
http请求是无状态的,每次请求和响应都是独立的,不会根据前面的请求来处理后面的请求,在
在BS
模式中浏览器每次发起http
请求,服务器给予响应,http
请求是无状态的。
🌸2.存在的问题
每个http
请求都是独立的,系统没办法识别哪些请求是同一个用户发送的。
这样就会有一个问题就是没办法记录客户端的是谁,
🏵️3.解决办法
🌱3.1cookie
为了解决这个问题就引入了cookie
,cookie
里面就包含了状态和信息,第一次请求的 时候服务器在http
的响应头set-cookie
,浏览器收到这个cookie
之后就把cookie
存储在浏览器当中,后面的每次请求在http
头都会带上这个cookie
。服务器根据每次的cookie
就会知道是谁发的请求。
cookie
的如果不设置 失效时间,浏览器关闭了之后就会失效。
🌲3.2 session
在cookie
中存的东西越来越多,导致了每次请求都要带上 这些内容,后来又有一种新的方式session
。
session
又叫做会话控制,是服务器用来保存用户状态而创建的一个对象,每一个session
对象都有一个唯一的SessionId
。
使用session
之后cookie
只需要存储这个SessionId
就行,每次携带这个SessionId
到服务器上查询到对应的session
对象就可以获取响应的信息。
session
的默认失效时间为30分钟
☘️3.3 禁用cookie
如果禁用浏览器禁用了cookie
那么如何实现存储用户状态呢?
如果浏览器禁用了cookie
,可以把SessionId
放在浏览器的url后面,服务器收到url请求的时候也可以获取到SessionId
。
🌳3.4 session和cookie的区别
session
存在于服务器端,cookie
存在于客户端session
可以存储很多数据,cookie
有大小只有4ksession
比cookie
安全
🌹4.session和cookie实现登录
🌺4.1 项目准备
1.登录页面的login.html
2.主页index.html
3.处理登录的方法
4.获取session
中数据的方法
5.过滤器
🌻4.2 登录页面
在static
目录下新建一个文件叫做login.html
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="http://localhost:9090/study/login" method="post">
<input type="text" name="username"/>
<input type="password" name="password">
<input type="submit" value="登录">
</form>
</body>
</html>
🌼4.3 登录逻辑处理
通过request
获取到登录输入的用户名和密码,这里不做校验,直接把用户名放到session
当中,然后重定向到index.html
。
java
@PostMapping("/login")
public void userLogin (HttpServletRequest request, HttpServletResponse response) {
String username = request.getParameter("username");
String password = request.getParameter("password");
HttpSession httpSession = request.getSession();
httpSession.setAttribute("username", username);
response.sendRedirect("index.html");
}
🥀4.4 主页
在index.html
页面中通过点击获取用户名获取username
的值
java
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<a href="http://localhost:9090/study/index">获取用户名</a>
</body>
</html>
🌷4.5 从session中获取值
java
@GetMapping("/index")
public String index(HttpServletRequest request, HttpServletResponse response) {
HttpSession session = request.getSession();
return (String) session.getAttribute("username");
}
🌴4.6 过滤器
过滤器,用于判断用户是否登录,即是否从session
中能获取到用户名称,如果能获取到说明用户是登陆了的,如果不能就跳转到登录页面。
java
@Component
@WebFilter(filterName="LoginFilter",urlPatterns="/*")
public class LoginFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpServletResponse res = (HttpServletResponse) servletResponse;
String path = req.getServletPath();
if (!StringUtils.equals("/login", path) && !path.contains("html")) {
HttpSession session = req.getSession();
String username = (String)session.getAttribute("username");
if (StringUtils.isEmpty(username)) {
res.sendRedirect("login.html");
}
}
filterChain.doFilter(servletRequest, servletResponse);
}
}