架构设计:登录设计 - 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);
    }
}
相关推荐
面试鸭1 分钟前
面试官:“知识库搜到多少资料,你就全喂给 AI?”我:“信息越多越准。”她亮出错答案:“那它怎么被废话带跑了?”
后端·面试·求职
米花米唐6 分钟前
Spring AI 2.0 会话记忆开发实践
后端
从零开始的代码生活_1 小时前
C++ stack、queue 与 priority_queue:容器适配器原理与实战
开发语言·c++·后端·学习·算法
爱勇宝1 小时前
《道德经》第6章:别把团队的创造力用到枯竭
前端·后端
无双_Joney1 小时前
[四期 - 4] NestJS专栏 - 征召一下大家的意见,非常想知道大家都想看看Nest的哪些方面
前端·后端·nestjs
彭亚川Allen1 小时前
停更的这一年,All In AI、陪媳妇生娃、还考了个研
前端·后端·产品经理
techdashen1 小时前
Go 1.25 新增 `reflect.TypeAssert`:更直接、更高效地从 `reflect.Value` 取出类型值
开发语言·后端·golang
千桐科技2 小时前
🚀 qModel 算法模型平台v1.2.0 开源版发布!Python 模型接入链路全面升级,告别“能跑但上不了线”的尴尬
后端·算法·llm
用户40966601317512 小时前
实时数据大屏的 4 种推送方案:短轮询 → 长轮询 → SSE → WebSocket
后端·面试
yinshaojun0012 小时前
Function Calling:从模型输出到安全的工具执行
后端