架构设计:登录设计 - 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);
    }
}
相关推荐
MC丶科4 小时前
【SpringBoot常见报错与解决方案】中文乱码?Spring Boot 统一解决前后端中文乱码问题(含 Postman 测试)!别再百度“加 UTF-8”了!
spring boot·后端·postman
XXOOXRT8 小时前
基于SpringBoot的加法计算器
java·spring boot·后端·html5
moxiaoran57539 小时前
Go语言的错误处理
开发语言·后端·golang
短剑重铸之日15 小时前
《7天学会Redis》特别篇: Redis分布式锁
java·redis·分布式·后端·缓存·redission·看门狗机制
小北方城市网15 小时前
SpringBoot 全局异常处理与接口规范实战:打造健壮可维护接口
java·spring boot·redis·后端·python·spring·缓存
hanqunfeng16 小时前
(三十三)Redisson 实战
java·spring boot·后端
小北方城市网17 小时前
SpringBoot 集成 MyBatis-Plus 实战(高效 CRUD 与复杂查询):简化数据库操作
java·数据库·人工智能·spring boot·后端·安全·mybatis
hanqunfeng18 小时前
(四十)SpringBoot 集成 Redis
spring boot·redis·后端
小北方城市网18 小时前
SpringBoot 集成 MinIO 实战(对象存储):实现高效文件管理
java·spring boot·redis·分布式·后端·python·缓存
程序员泠零澪回家种桔子19 小时前
RAG自查询:让AI精准检索的秘密武器
人工智能·后端·算法