实现Java Web程序的自动登录

简介: 本文为原创,如需转载,请注明作者和出处,谢谢! 有很多Web程序中第一次登录后,在一定时间内(如2个小时)再次访问同一个Web程序时就无需再次登录,而是直接进入程序的主界面(仅限于本机)。
本文为原创,如需转载,请注明作者和出处,谢谢!

有很多Web程序中第一次登录后,在一定时间内(如2个小时)再次访问同一个Web程序时就无需再次登录,而是直接进入程序的主界面(仅限于本机)。实现这个功能关键就是服务端要识别客户的身份。而用Cookie是最简单的身从验证。

如果用户第一次登录,可以将用户名作为Cookie写到本地,代码如下:


Cookie cookie  =   new  Cookie( " user " , user);
cookie.setMaxAge(
365   *   24   *   3600 );
cookie.setPath(
" / " );
response.addCookie(cookie);

    当用户再次访问程序时,服务端程序应该检测这个 Cookie 是否存在,代码如下:

Cookie[] cookies = request.getCookies();
for (Cookie cookie: cookies)
{
    if (cookie.getName().equals(user))
    {
       
//  如果user Cookie存在,进行处理
        break ;
    }
}

    尽管从客户端可以获得 User Cookie ,但这上 Cookie 可能存在很长时间,而且仅凭这个 Cookie 就自动登录并不安全,因此,可以在服务端使用一个 Session 来管理用户。也就是当第一次登录成功后,就创建一个 Session ,并将用户的某些信息保存在 Session 顺。代码如下:

HttpSession session  = request.getSession();
session.setAttribute(user, user);
session.setMaxInactiveInterval(
2   *   3600 );   //  Session保存两小时

    
当再次访问程序时,确定了 cookie 存在后,就会继续验证 User Session 的存在,代码如下:

Cookie[] cookies = request.getCookies();
for (Cookie cookie: cookies)
{
    if (cookie.getName().equals(user))
    {
       
if (session.getAttribute(user)  !=   null )
        {
           
//  直接forward到主界面
           break ;
        }
        else
        { 
           
//  forward到登录界面
         }
     }
}

    虽然上面的代码可以很好地实现自动登录功能,但是当浏览器关闭,再次启动后,由于 Servlet 用于保存 Session ID JSESSIONID Cookie 是临时的(也就是说不是持久 Cookie ,当浏览器关闭后,这个 Cookie 就会被删除),因此,需要将 JSESSIONID 进行持久化。代码如下:

HttpSession session  =  request.getSession();
session.setAttribute(user, user);
session.setMaxInactiveInterval(
2   *   3600 );   //  Session保存两小时
Cookie cookie  =   new  Cookie( " JSESSIONID " , session.getId());
cookie.setMaxAge(
2   *   3600 );   //  客户端的JSESSIONID也保存两小时
session.setMaxInactiveInterval(interval)
cookie.setPath(
" / " );        
response.addCookie(cookie);

如果使用上面的代码,即使浏览器关闭,在两小时之内,Web程序仍然可以自动登录。

如果我们自已加一个JSESSIONID Cookie,在第一次访问Web程序时,HTTP响应头有两个JSESSIONID,但由于这两个JSESSIONID的值完全一样,因此,并没有任何影响。如果在响应头的Set-Cookie字段中有多个相同的Cookie,则按着pathname进行比较,如果这两个值相同,则认为是同一个Cookie,最后一个出现的Cookie将覆盖前面相同的Cookie,如下面的两个Cookie,最后一个将覆盖前一个:

Set-Cookie: JSESSIONID=DDB2274CAC6739E1D6747B0043D5D90E; Path=/web

Set-Cookie: JSESSIONID=mysession; Expires=Thu, 05-Jun-2008 05:02:50 GMT; Path=/web

    由于下面两个Cookiepath不同,因此,它们是完全不同的两个Cookie

Set-Cookie: JSESSIONID=DDB2274CAC6739E1D6747B0043D5D90E; Path=/web1

Set-Cookie: JSESSIONID=mysession; Expires=Thu, 05-Jun-2008 05:02:50 GMT; Path=/web2


谁有其他的方法实现自动登录,请跟贴!
目录
相关文章
|
7月前
|
安全 Java API
Java Web 在线商城项目最新技术实操指南帮助开发者高效完成商城项目开发
本项目基于Spring Boot 3.2与Vue 3构建现代化在线商城,涵盖技术选型、核心功能实现、安全控制与容器化部署,助开发者掌握最新Java Web全栈开发实践。
707 1
|
8月前
|
人工智能 监控 安全
智慧工地解决方案,java智慧工地程序代码
智慧工地系统融合物联网、AI、大数据等技术,实现对施工现场“人、机、料、法、环”的全面智能监控与管理,提升安全、效率与决策水平。
249 2
|
6月前
|
安全 Java
Java异常处理:程序世界的“交通规则
Java异常处理:程序世界的“交通规则
375 98
|
7月前
|
存储 前端开发 Java
【JAVA】Java 项目实战之 Java Web 在线商城项目开发实战指南
本文介绍基于Java Web的在线商城技术方案与实现,涵盖三层架构设计、MySQL数据库建模及核心功能开发。通过Spring MVC + MyBatis + Thymeleaf实现商品展示、购物车等模块,提供完整代码示例,助力掌握Java Web项目实战技能。(238字)
851 0
|
7月前
|
弹性计算 监控 网络安全
如何轻松使用AWS Web应用程序防火墙?
AWS WAF是Web应用防火墙,可防护常见网络攻击。通过创建Web ACL并设置规则,保护CloudFront、API网关、负载均衡器等资源。支持自定义规则与OWASP预定义规则集,结合CloudWatch实现监控日志,提升应用安全性和稳定性。
|
安全 JavaScript 前端开发
AppSpider 7.5.020 发布 - Web 应用程序安全测试
AppSpider 7.5.020 for Windows - Web 应用程序安全测试
183 0
|
7月前
|
存储 安全 Java
如何在 Spring Web 应用程序中使用 @SessionScope 和 @RequestScope
Spring框架中的`@SessionScope`和`@RequestScope`注解用于管理Web应用中的状态。`@SessionScope`绑定HTTP会话生命周期,适用于用户特定数据,如购物车;`@RequestScope`限定于单个请求,适合无状态、线程安全的操作,如日志记录。合理选择作用域能提升应用性能与可维护性。
318 1
|
8月前
|
前端开发 Java 数据库
Java 项目实战从入门到精通 :Java Web 在线商城项目开发指南
本文介绍了一个基于Java Web的在线商城项目,涵盖技术方案与应用实例。项目采用Spring、Spring MVC和MyBatis框架,结合MySQL数据库,实现商品展示、购物车、用户注册登录等核心功能。通过Spring Boot快速搭建项目结构,使用JPA进行数据持久化,并通过Thymeleaf模板展示页面。项目结构清晰,适合Java Web初学者学习与拓展。
545 1
|
7月前
|
存储 Java 编译器
对比Java学习Go——程序结构与变量
本节对比了Java与Go语言的基础结构,包括“Hello, World!”程序、代码组织方式、入口函数定义、基本数据类型及变量声明方式。Java强调严格的面向对象结构,所有代码需置于类中,入口方法需严格符合`public static void main(String[] args)`格式;而Go语言结构更简洁,使用包和函数组织代码,入口函数为`func main()`。两种语言在变量声明、常量定义、类型系统等方面也存在显著差异,体现了各自的设计哲学。
280 0