架构设计:登录设计 - 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);
    }
}
相关推荐
monkey_meng12 分钟前
【Rust中的迭代器】
开发语言·后端·rust
余衫马14 分钟前
Rust-Trait 特征编程
开发语言·后端·rust
monkey_meng18 分钟前
【Rust中多线程同步机制】
开发语言·redis·后端·rust
paopaokaka_luck5 小时前
【360】基于springboot的志愿服务管理系统
java·spring boot·后端·spring·毕业设计
码农小旋风6 小时前
详解K8S--声明式API
后端
Peter_chq6 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
Yaml47 小时前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
小小小妮子~7 小时前
Spring Boot详解:从入门到精通
java·spring boot·后端
hong1616887 小时前
Spring Boot中实现多数据源连接和切换的方案
java·spring boot·后端
睡觉谁叫~~~8 小时前
一文解秘Rust如何与Java互操作
java·开发语言·后端·rust