登陆校验
2026年1月3日大约 8 分钟
登陆校验
在Web应用程序中,用户登录是一个常见的功能。为了确保只有合法用户才能访问受保护的资源,我们需要对用户进行登录校验。
会话技术
在HTTP协议中,请求是无状态的,这意味着每个请求都是独立的,服务器不会记住之前的请求信息。为了实现登录校验,我们需要使用会话技术来维护用户的登录状态。
- 会话:指用户使用浏览器访问web服务器时,会话建立,直到有一方断开连接,会话结束。一次会话中,可以包括多次请求和响应。
- 会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自同一个用户,以便在同一次会话的多次请求中共享数据。
常见的会话跟踪技术有以下三种:
- Session:服务器端会话跟踪技术,通过在服务器上存储用户的登录状态信息来实现会话管理。每个用户在登录后,服务器会为其创建一个唯一的Session ID,并将其发送给客户端。客户端在后续请求中会携带该Session ID,服务器通过该ID来识别用户的登录状态。
- Cookie:客户端会话跟踪技术,通过在客户端浏览器中存储用户的登录状态信息来实现会话管理。服务器在响应中会设置一个Cookie,客户端浏览器会在后续请求中自动携带该Cookie,服务器通过该Cookie来识别用户的登录状态。
- Token:令牌技术,无状态会话,通过在客户端和服务器之间传递一个令牌(Token)来实现会话管理。用户登录后,服务器会生成一个Token并发送给客户端,客户端在后续请求中携带该Token,服务器通过验证Token来识别用户的登录状态。
Cookie(不推荐)
Cookie是存储在客户端浏览器中的数据,用于保存用户的登录状态信息。服务器在响应中设置Cookie,客户端浏览器会在后续请求中自动携带该Cookie。
- 优点:HTTP协议支持。
- 缺点:
- 安全性较低,Cookie数据容易被篡改和盗用,并且用户可以禁用Cookie。
- 移动端支持不佳。
- Cookie不能跨域。
什么是跨域
跨域是指在浏览器中,当前网页的域名、协议或端口与请求的资源的域名、协议或端口不一致的情况。浏览器出于安全考虑,默认情况下会阻止跨域请求。
- 是否跨域的判断方法:协议、IP/域名、端口号,三者有一个不同就属于跨域。
Session(不推荐)
Session是存储在服务器端的数据,用于保存用户的登录状态信息。每个用户在登录后,服务器会为其创建一个唯一的Session ID,并将其发送给客户端。客户端在后续请求中会携带该Session ID,服务器通过该ID来识别用户的登录状态。
- 优点:存储在服务器端,安全性较高。
- 缺点:
- 在服务器集群环境下,无法直接使用Session。
- Cookie的缺点依然存在,因为Session ID通常存储在Cookie中。
Token
Token是一种无状态的会话管理技术,通过在客户端和服务器之间传递一个令牌(Token)来实现会话管理。用户登录后,服务器会生成一个Token并发送给客户端,客户端在后续请求中携带该Token,服务器通过验证Token来识别用户的登录状态。
- 优点:
- 无状态,适用于分布式系统和微服务架构。
- 多端支持良好,适用于移动端和Web端。
- 缺点:需要额外的Token生成和验证机制。
JWT令牌
JWT(Json Web Token)是一种基于Token的身份验证机制,用于在客户端和服务器之间传递用户的身份信息。
- JWT由三部分组成:
- 头部(Header):记录令牌类型和签名算法。
- 载荷(Payload):携带自定义的信息。
- 签名(Signature):根据前面两部分和密钥生成的签名,用于验证令牌的完整性和真实性,防止篡改。
JWT工作流程
- 用户登录:用户通过提供用户名和密码进行登录请求。
- 服务器验证:服务器验证用户的身份信息,如果验证通过,生成JWT令牌。
- 返回令牌:服务器将生成的JWT令牌返回给客户端(通过请求头或响应体)。
- 客户端存储:客户端将JWT令牌存储在本地(如LocalStorage或SessionStorage)。
- 后续请求:客户端在后续请求中携带JWT令牌,通常通过HTTP头部的Authorization字段传递。
- 服务器验证令牌:服务器接收到请求后,验证JWT令牌的有效性和完整性。
- 访问受保护资源:如果令牌验证通过,服务器允许访问受保护的资源,否则拒绝访问。
登陆校验实现思路
令牌生成:登陆成功后,服务端生成JWT令牌,返回给客户端。
令牌校验:请求到达服务端后,对令牌进行统一拦截、校验。
过滤器Filter-实现登录校验(了解)
- Filter:过滤器,是JavaWeb三大组件(Servlet、Filter、Listener)之一。
- 过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。
- 过滤器一般用于完成通用的操作,如登录校验、敏感字符处理等。
Filter使用方法
- 实现Filter接口,重写其中的方法:
init(FilterConfig filterConfig):初始化方法,在过滤器创建时调用。doFilter(ServletRequest request, ServletResponse response, FilterChain chain):核心方法,用于处理请求和响应。destroy():销毁方法,在过滤器销毁时调用。
@WebFilter(urlPatterns = "/*") // 指定拦截的路径,这里是拦截所有请求
public class LoginFilter implements Filter {
@Override // 初始化方法,只调用一次
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override // 核心处理方法,每次请求都会调用
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 处理请求和响应的代码
chain.doFilter(request, response); // 放行,给web容器继续处理请求
// 放行后,向客户端响应前可以在这里处理返回的数据
}
@Override // 销毁方法,只调用一次
public void destroy() {
}
}- 注册过滤器:
- 通过
@WebFilter注解注册过滤器,并指定拦截的路径。(如上例所示) - 还需要在SpringBoot应用类上添加
@ServletComponentScan注解,启用过滤器扫描。
@SpringBootApplication
@ServletComponentScan // 启用过滤器扫描
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}Filter执行流程

Filter执行特点
- 放行后访问到对应资源,资源访问完成后,还会回到Filter中。
- 回到Filter后,会执行放行后逻辑。
过滤器链
- 过滤器链(Filter Chain):当有多个过滤器时,过滤器会按照配置的顺序依次执行,形成一个过滤器链。
- Filter链优先级,默认按照过滤器类名的字母顺序执行。

登陆校验总体流程(Filter实现)
.png)
拦截器Interceptor-实现登录校验(重点)
- Interceptor:拦截器,类似于过滤器,是SpringMVC框架提供的一种机制,用于动态拦截控制器方法的执行。
- 拦截器作用:拦截请求,根据业务执行对应代码。
Interceptor使用方法
- 定义拦截器类,实现HandlerInterceptor接口,重写其中的方法:
preHandle(HttpServletRequest request, HttpServletResponse response, Object handler):在控制器方法执行前调用。postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView):在控制器方法执行后调用,但在视图渲染前调用。afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex):在视图渲染后调用。
public class LoginInterceptor implements HandlerInterceptor {
@Override // 控制器方法执行前调用
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// 处理请求的代码
return true; // 返回true表示继续执行控制器方法,返回false表示中断(即返回false不会执行对应Controller的方法)
}
@Override // 控制器方法执行后调用,视图渲染前调用
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// 处理响应的代码
}
@Override // 视图渲染后调用
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception ex) throws Exception {
// 清理资源的代码
}
}- 注册拦截器:
- 创建配置类,实现WebMvcConfigurer接口,重写addInterceptors方法,注册拦截器。
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor())
.addPathPatterns("/**") // 指定拦截的路径,这里是拦截所有请求
.excludePathPatterns("/login", "/register"); // 排除不拦截的路径
}
}拦截路径
- 拦截路径:通过
addPathPatterns方法指定需要拦截的请求路径。 - 排除路径:通过
excludePathPatterns方法指定不需要拦截的请求路径。
常用拦截路径配置:
| 拦截路径配置 | 说明 | 示例 |
|---|---|---|
/* | 一级路径 | /login、/register 不能匹配 login/1 |
/** | 任意级路径 | /login、/register、/login/1 都能匹配 |
/api/* | 拦截/api下的一级路径 | /api/login能匹配,/api/login/1 以及 /api 不能匹配 |
/api/** | 拦截/api下的多级路径 | /api/login、/api/login/1 、/api都能匹配 |
interceptor执行流程
