架构设计:登录设计 - Session和Cookie实现登录

💐1.http请求

http请求是无状态的,每次请求和响应都是独立的,不会根据前面的请求来处理后面的请求,在

BS模式中浏览器每次发起http请求,服务器给予响应,http请求是无状态的。

🌸2.存在的问题

每个http请求都是独立的,系统没办法识别哪些请求是同一个用户发送的。

这样就会有一个问题就是没办法记录客户端的是谁,

🏵️3.解决办法

🌱3.1cookie

为了解决这个问题就引入了cookiecookie里面就包含了状态和信息,第一次请求的 时候服务器在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有大小只有4k
  • sessioncookie安全

🌹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);
    }
}
相关推荐
vx_bisheyuange3 分钟前
基于SpringBoot的海鲜市场系统
java·spring boot·后端·毕业设计
李慕婉学姐44 分钟前
【开题答辩过程】以《基于Spring Boot和大数据的医院挂号系统的设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
大数据·spring boot·后端
源代码•宸2 小时前
Leetcode—3. 无重复字符的最长子串【中等】
经验分享·后端·算法·leetcode·面试·golang·string
0和1的舞者2 小时前
基于Spring的论坛系统-前置知识
java·后端·spring·系统·开发·知识
invicinble3 小时前
对于springboot
java·spring boot·后端
码界奇点4 小时前
基于Spring Boot与Vue的校园后台管理系统设计与实现
vue.js·spring boot·后端·毕业设计·源代码管理
爱编程的小庄4 小时前
Rust 发行版本及工具介绍
开发语言·后端·rust
Apifox.5 小时前
测试用例越堆越多?用 Apifox 测试套件让自动化回归更易维护
运维·前端·后端·测试工具·单元测试·自动化·测试用例
sunnyday04265 小时前
Nginx与Spring Cloud Gateway QPS统计全攻略
java·spring boot·后端·nginx
康王有点困5 小时前
Link入门
后端·flink