登录流程介绍

什么是登录

在互联网上,供多人使用的网站或应用系统会为每位用户都配置一套独特的用户名和密码,用户可以使用自己的用户名和密码进入系统,以便系统识别该用户的身份,从而保存该用户的使用习惯、使用数据。用户使用这套用户名和密码进入系统,以及系统验证进入成功或失败的过程,被称为登录。

在登录成功后,用户就可以合法地使用该账号具有的各项功能。例如,淘宝网用户可以正常浏览商品和购买商品等;论坛用户可以查看或更改资料、发表和回复帖子等;OA(办公自动化)等系统管理员用户可以正常地处理各种数据和信息。从最简单的角度来说,登录就是输入用户名和密码进入一个系统进行访问和操作。

用户登录状态

客户端(通常是浏览器)在连上 Web 服务器后,要想获得 Web 服务器中的各种资源,就需要遵守一定的通信规则。Web 项目通常使用 HTTP,它用于定义客户端与 Web 服务器通信的方式。HTTP 是无状态的协议,也就是说,这个协议是无法记录用户访问状态的,其每次请求都是独立的、没有任何关联的。

以新蜂商城(本书实战项目)的后台管理系统为例,它拥有多个页面。在页面跳转过程中和通过接口进行数据交互时,系统需要知道用户的状态,尤其是用户登录的状态,以便服务器验证用户状态是否正常。这样系统才能判断是否可以让当前用户使用某些功能或获取某些数据。

这时,就需要在每个页面上都对用户的身份进行验证和确认,但现实情况却不是如此。一个网站不可能让用户在每个页面上都输入用户名和密码,这是一个违反操作逻辑的设计,也没有用户愿意使用这样的系统。

因此,在设计登录流程时,只让用户进行一次登录操作。为了实现这个功能,需要一些辅助技术,用得最多的技术就是浏览器的 Cookie。而在 Java Web 开发中,比较常见的是使用 Session 技术来实现。将用户登录的信息存放在 CookieSession 中,这样就可以通过读取在 CookieSession 中的用户登录信息,达到记录用户状态、验证用户状态的目的。

登录流程设计

登录的本质是身份验证和登录状态的保持,在实际编码中是如何实现的呢?

首先,在数据库中查询这条用户记录,伪代码如下:

select * from xxx_user where account_number = 'xxxx';

如果不存在这条记录,则表示身份验证失败,登录流程终止;如果存在这条记录,则表示身份验证成功。

其次,进行登录状态的存储和验证,存储的伪代码如下:

//通过 Cookie 存储
Cookie cookie = new Cookie("userName",xxxxx);

//通过 Session 存储
session.setAttribute("userName",xxxxx);

验证逻辑的伪代码如下:

//通过 Cookie 获取需要验证的数据并进行校验
Cookie cookies[] = request.getCookies();
if (cookies != null){
    for (int i = 0; i < cookies.length; i++){
        Cookie cookie = cookies[i];
        if (name.equals(cookie.getName())){
            return cookie;
        }
    }
}

//通过 Session 获取需要验证的数据并进行校验
session.getAttribute("userName");

登录的本质是身份验证和用户状态的保持,还有一点不能忽略,就是登录功能的安全验证设计。一般的做法是将密码加密存储,不过千万不要在 Cookie 中存放用户密码,加密的密码也不行。因为这个密码可以被人获取并尝试离线穷举。同样,有些网站会在 Cookie 中存储一些用户的敏感信息,这些都是不安全的行为。

在本书的实战项目中,通过生成用户令牌 token 的形式进行用户状态的保持和身份验证。简单理解,这里所说的 token 就是后端生成的一个字符串,该字符串与用户信息关联,token 字符串通过一些无状态的数据生成,并不包含用户的敏感信息。

简易的登录流程如图 3-1 所示。

当然,还有一些验证操作是必需的。比如,前端在发送数据时需要验证数据格式及有效性,后端接口在访问之前也需要验证用户信息是否有效,因此完整的登录流程如图 3-2 所示。

image 2025 04 23 12 23 03 053
Figure 1. 图3-1 简易的登录流程
image 2025 04 23 12 23 21 682
Figure 2. 图3-2 完整的登录流程