随笔 - 312, 文章 - 14, 评论 - 1393, 引用 - 0
数据加载中……

实现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 IDJSESSIONID 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


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






Android开发完全讲义(第2版)(本书版权已输出到台湾)

http://product.dangdang.com/product.aspx?product_id=22741502



Android高薪之路:Android程序员面试宝典 http://book.360buy.com/10970314.html


新浪微博:http://t.sina.com.cn/androidguy   昵称:李宁_Lining

posted on 2008-06-05 13:49 银河使者 阅读(12892) 评论(8)  编辑  收藏 所属分类: web 原创

评论

# re: 实现Java Web程序的自动登录[未登录]  回复  更多评论   

有几个问题需要和你探讨一下
1、为什么要长时间保存Session,这样不利用大量的请求,除非在用户很少的情况下。
2、可以使用Cookie把用户名和处理以后的密码存入,下次访问可以使用新的Session进行权限验证就是了。至于该用户的原Session信息。,可以采用其他方式保存下来,下次登录进来验证通过在加载就可以了
2008-06-06 18:07 | Samuel

# re: 实现Java Web程序的自动登录  回复  更多评论   

要保存用户的信息,只能在客户端或服务端来保存,如果在客户端的cookie保存,有些信息无法保存,或比较麻烦,如对象等。

在本例中因为我要实现当出现用户登录界面时,显示用户名,而这在可能要保存一年时间,而我又不想在一年内都自动登录,所以用了session,并设了两个小时。


第二个问题。当然可以只使用cookie来保存用户名和密码。只因为我要实现短时间的自动登录,所以才用了session。
2008-06-06 18:16 | 银河使者

# re: 实现Java Web程序的自动登录  回复  更多评论   

现在我想知道的是除了将用户名和密码保存在cookie中,或使用session,还有没有别的方法。
2008-06-06 18:55 | 银河使者

# re: 实现Java Web程序的自动登录  回复  更多评论   

@银河使者
我觉得 都不好
一个session存的时间太长
第二cookie一点都不安全
想想就两个cookies 一个用户名 一个密码 就当真的被人看不出里面是什么意义
但无论怎么样 只要有这两个cookies 你就能登陆
别人也可以用js写出cookies 所以一点都不安全
2009-07-27 20:10 | 兔乃伊

# re: 实现Java Web程序的自动登录  回复  更多评论   

我觉得可以这样
把session里面的内容持久化的数据库
登录的时候去数据库查查
如果有自动登录信息的话
就开一个新的session给他
然后把登录信息存在session里面
这样我觉得可行
2009-07-27 20:23 | 兔乃伊

# re: 实现Java Web程序的自动登录  回复  更多评论   

用监听的方法 session失效 就持久化
2009-07-27 20:24 | 兔乃伊

# re: 实现Java Web程序的自动登录  回复  更多评论   

还不错,如果能用一个完整的项目案例就好了
2013-01-05 10:35 | bbkwang

# re: 实现Java Web程序的自动登录  回复  更多评论   

天赋
2016-06-02 16:05 | 委屈

只有注册用户登录后才能发表评论。


网站导航: