实现Java 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,则按着path和name进行比较,如果这两个值相同,则认为是同一个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

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

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

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

谁有其他的方法实现自动登录,请跟贴!

国内最棒的Google Android技术社区(eoeandroid),欢迎访问!

《银河系列原创教程》发布

《Java Web开发速学宝典》出版,欢迎定购

时间: 2024-09-28 10:28:05

实现Java Web程序的自动登录的相关文章

网站 自动登录-怎么样写个程序,自动登录一个网站,然后填报表,然后发送

问题描述 怎么样写个程序,自动登录一个网站,然后填报表,然后发送 是这样的,平时工作里,我要登录一个网站做上班登记,要填一张表,最后发送,一天要登记四五回.用什么语言,什么方式,学什么知识,可以写一个程序,自动登录这个网站(我提供账号密码),然后完成填表,发送呢? 顺便我会c,c++,c#会一点,ruby懂,没用过rails,web开发没试过,谢谢. 一点头绪都没有,请致电,谢谢

java web程序,防止用户暴力破解

问题描述 java web程序,防止用户暴力破解 最近项目需要增加一个防止用户多次登录的程序,类似于163邮箱的登录失败五次,30分钟后才可以登录,这个思路是什么 解决方案 在数据库中增加两个字段 lasttrycount lasttrydate 密码输错 lastdate记录当前时间,lasttrycount + 1 如果lasttrycount = 5并且now - lasttrydate <半小时,不许登录 如果密码输入正确,lasttrycount=0 解决方案二: 个人思路,说的不好请

java web 程序 可不可以在客户端运行键盘钩子 要 怎么做?

问题描述 java web 程序 可不可以在客户端运行键盘钩子 要 怎么做? 50C java web 程序 可不可以在客户端运行键盘钩子 要 怎么做? 解决方案 可以试一下ActiveX控件+DLL的方式 解决方案二: web程序本身进程来加载键盘hook DLL 解决方案三: 亲们 帮帮忙 最后一哆嗦了 解决方案四: 这个是个现成的程序你参考一下:http://download.csdn.net/detail/qwe852012/1720478 解决方案五: 在服务端是可以 我要的是在客户端

Java web程序eclipse调试出现source not found错误

问题描述 Java web程序eclipse调试出现source not found错误 大牛指点一下,以下是详细错误信息: HTTP Status 500 - Request processing failed; nested exception is java.lang.NullPointerException type Exception report message Request processing failed; nested exception is java.lang.Null

设计-数据计算量大、存储量大但是功能简单的java Web程序,采用什么框架比较好?

问题描述 数据计算量大.存储量大但是功能简单的java Web程序,采用什么框架比较好? 如题,我是开发人员刚刚接触设计,现在有一个项目是数据的存储量和计算量比较大,但是功能相对简单,选用什么框架比较好呢?能尽量使存储效率和计算速率都比较高? 是b/s结构的程序,是否需要用ssh或者ssi? 谢谢! 解决方案 数据计算量大,不适合放在web应用层来做,应该用后台作业去完成.因为web应用层不适合维持长期的连接和长时占用计算资源. 解决方案二: 直接servlet/jsp就行呗. 解决方案三: 个

java web-如何将一个Java Web程序包装成一个c/s程序?

问题描述 如何将一个Java Web程序包装成一个c/s程序? 假如现有一个Java Web程序,如何用C++/C#代码将此程序包装成一个客户端程序? 解决方案 一个简单的C/S 架构程序 解决方案二: 其实可以用编程语言编写一个外框,在外框里面加载相应的页面即可.具体你可以看下硕鼠这个软件..他们好像就是这么做的 解决方案三: 你用C#建立一个WinForm应用程序,然后窗体中使用WebBrowser来链接你 Java Web页面就可以啦

Java Web基于Session的登录实现方法_java

本文实例讲述了Java Web基于Session的登录实现方法.分享给大家供大家参考,具体如下: package cn.com.login; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpSer

java的web程序的自动升级

问题描述 我的web程序已经部署在服务器上,要实现这样一个问题类似自动升级:后台程序某些类作了修改,不重新部署war包的情况下怎么升级程序?是不是要用监听?急急急! 解决方案 解决方案二:估计不行把..如果你改变了JAVA程序需要重新启动服务器的.解决方案三:如果是只改了java文件,贴个class上去,也要重启下服务器,除非是网页文件,那个jsp的那些就不要,其他的好像还是要的,如果你的项目都是jsp生成的,那估计改改jsp是不需要重启.解决方案四:tomcat可以设置为自动加载,reload

java web程序实现痕迹保留

问题描述 请问在java web项目中如何做到保留用户操作痕迹的功能? 我想要实现的效果是: 当XX用户登录到系统后,记住XX的每一个操作.记录结果如,XX于XX时间进入XX页面做了XX(增删改)操作...于XX时间退出系统(不论用户是关闭浏览器,点击系统提供的退出按钮还是直接关闭电脑). 大概的想法就如上所述,如果有什么没有说清楚的地方,请给我留言,谢谢^_^ 解决方案 SSH框架使用中,每一个框架都提供给用户记录日志的相关接口,你可以使用Struts中的Log4j将日志以不同方式记录,如存储