架构设计:登录设计 - 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);
    }
}
相关推荐
计算机学姐4 分钟前
基于PHP的电脑线上销售系统
开发语言·vscode·后端·mysql·编辑器·php·phpstorm
码拉松1 小时前
千万不要错过,优惠券设计与思考初探
后端·面试·架构
白总Server2 小时前
MongoDB解说
开发语言·数据库·后端·mongodb·golang·rust·php
计算机学姐2 小时前
基于python+django+vue的家居全屋定制系统
开发语言·vue.js·后端·python·django·numpy·web3.py
程序员-珍3 小时前
SpringBoot v2.6.13 整合 swagger
java·spring boot·后端
海里真的有鱼3 小时前
好文推荐-架构
后端
骆晨学长3 小时前
基于springboot的智慧社区微信小程序
java·数据库·spring boot·后端·微信小程序·小程序
AskHarries3 小时前
利用反射实现动态代理
java·后端·reflect
Flying_Fish_roe4 小时前
Spring Boot-Session管理问题
java·spring boot·后端
hai405875 小时前
Spring Boot中的响应与分层解耦架构
spring boot·后端·架构