资讯动态

JavaWeb登录校验技术:Cookie-Session与JWT实战解析

发布时间:2026/9/11 3:58:00 来源:尧图企业网站定制
1. 登录校验技术全景解析在JavaWeb开发中登录校验是保障系统安全的第一道防线。现代Web应用通常采用三种主流技术方案Cookie-Session机制、Token令牌技术以及两者的混合模式。我们先从最基础的Cookie-Session开始拆解。1.1 Cookie工作原理深度剖析Cookie的本质是服务器发送到浏览器并保存在本地的小型文本数据。当浏览器再次请求同一服务器时会自动携带这些数据。关键属性包括Domain/PATH指定Cookie的作用域Expires/Max-Age控制有效期Secure仅HTTPS传输HttpOnly禁止JS访问SameSite防御CSRF攻击// Java中设置Cookie的典型代码 Cookie cookie new Cookie(user, uid123); cookie.setMaxAge(60*60*24); // 1天有效期 cookie.setPath(/); cookie.setHttpOnly(true); response.addCookie(cookie);关键经验生产环境必须设置HttpOnly和Secure属性这是防御XSS攻击的基本要求。Chrome 80版本对SameSite的默认策略变更需要显式设置SameSiteNone; Secure才能实现跨站传递。1.2 Session机制实现细节Session是服务器端的会话存储其核心流程包含创建唯一SessionID通常采用UUID通过Set-Cookie将SessionID写入客户端服务器维护Session存储内存/Redis/数据库请求时通过SessionID恢复会话状态// Session基本操作示例 HttpSession session request.getSession(); session.setAttribute(user, userObj); session.setMaxInactiveInterval(1800); // 30分钟过期常见陷阱默认情况下Tomcat使用JSESSIONID作为Cookie名称在多个应用共用一个域名时会发生覆盖。解决方案是通过context.xml配置cookieName属性。2. 令牌技术演进与实践2.1 JWT标准令牌详解JWT(JSON Web Token)由三部分组成Header声明算法和类型{alg: HS256, typ: JWT}Payload存储业务数据{sub:123,name:John,iat:1516239022}Signature防篡改签名Java生态中常用jjwt库实现String token Jwts.builder() .setSubject(123) .setExpiration(new Date(System.currentTimeMillis()3600000)) .signWith(SignatureAlgorithm.HS256, secret) .compact();2.2 刷新令牌模式为解决短期令牌频繁过期问题通常采用双Token方案Access Token短期有效如2小时Refresh Token长期有效如7天sequenceDiagram Client-Server: 使用refresh_token获取新access_token Server--Client: 返回新access_tokenrefresh_token性能优化Redis非常适合存储令牌关系可采用hash结构存储token关联信息设置自动过期时间与令牌有效期同步。3. 过滤器与拦截器实战3.1 Filter过滤链实现过滤器是Servlet规范定义的组件执行顺序由web.xml中 顺序决定public class AuthFilter implements Filter { Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request (HttpServletRequest) req; String token request.getHeader(Authorization); // 验证逻辑 if(!validToken(token)) { ((HttpServletResponse)res).sendError(401); return; } chain.doFilter(req, res); } }3.2 Spring拦截器应用Interceptor相比Filter能获取Spring上下文更适合业务校验public class AuthInterceptor extends HandlerInterceptorAdapter { Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { String uri request.getRequestURI(); if(uri.startsWith(/api/)) { User user (User) request.getSession().getAttribute(user); if(user null) { response.sendRedirect(/login); return false; } } return true; } }架构建议将过滤器和拦截器结合使用过滤器处理通用安全防护XSS/CSRF拦截器处理业务权限校验。4. 安全加固方案4.1 防御会话固定攻击// 登录成功后重置SessionID request.getSession().invalidate(); HttpSession newSession request.getSession(true);4.2 敏感操作二次验证// 使用Redis实现操作令牌 String confirmToken UUID.randomUUID().toString(); redisTemplate.opsForValue().set( confirm:userId, confirmToken, 5, TimeUnit.MINUTES);5. 性能优化实践5.1 分布式会话方案// Spring Session配置示例 EnableRedisHttpSession public class SessionConfig { Bean public LettuceConnectionFactory connectionFactory() { return new LettuceConnectionFactory(); } }5.2 令牌黑名单处理// 登出时将令牌加入黑名单 public void logout(String token) { long expire Jwts.parser() .setSigningKey(secret) .parseClaimsJws(token) .getBody() .getExpiration() .getTime(); redisTemplate.opsForValue().set( blacklist:token, 1, expire - System.currentTimeMillis(), TimeUnit.MILLISECONDS); }6. 现代认证架构演进6.1 OAuth2.0集成EnableAuthorizationServer public class AuthServerConfig extends AuthorizationServerConfigurerAdapter { Override public void configure(ClientDetailsServiceConfigurer clients) throws Exception { clients.inMemory() .withClient(client) .secret(passwordEncoder.encode(secret)) .authorizedGrantTypes(authorization_code, refresh_token) .scopes(read); } }6.2 无状态架构设计// 基于JWT的stateless方案 public class StatelessAuthFilter extends OncePerRequestFilter { Override protected void doFilterInternal(HttpServletRequest req, HttpServletResponse res, FilterChain chain) { String token req.getHeader(X-TOKEN); if(token ! null) { Claims claims Jwts.parser() .setSigningKey(secret) .parseClaimsJws(token) .getBody(); UsernamePasswordAuthenticationToken auth new UsernamePasswordAuthenticationToken( claims.getSubject(), null, AuthorityUtils.commaSeparatedStringToAuthorityList( claims.get(roles).toString())); SecurityContextHolder.getContext().setAuthentication(auth); } chain.doFilter(req, res); } }在实际项目开发中我通常会根据安全等级要求选择不同方案内部管理系统Cookie-Session 验证码移动端APIJWT 刷新令牌高安全系统双因素认证 短期令牌对于新启动的项目建议直接采用Spring Security OAuth2资源服务器方案可以灵活支持多种认证方式切换。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价