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


谁有其他的方法(可以是任何语言或技术)实现自动登录,请跟贴!

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

评论

#1楼  2008-06-05 19:22 哦,奇怪      

哦,沙发:)   回复  引用  查看    

#2楼  2008-06-05 20:10 zzzzz [未注册用户]

forms验证可以实现   回复  引用    

#3楼  2008-06-05 20:46 top10-it [未注册用户]

这也可以上首页???   回复  引用    

#4楼  2008-06-05 20:54 缤纷      

session容易丢失.
一般我都是把用户名和密码保存在cookies中   回复  引用  查看    

#5楼 [楼主] 2008-06-05 21:04 银河使者      

把密码保存在cookies中,比较危险啊。cookies是保存在客户端的。就算加密了,感觉也有些隐患。

session不会无缘无故丢失的,可能是程序的问题。   回复  引用  查看    

#6楼  2008-06-05 21:59 Yunan [未注册用户]

一楼回贴 和屁一样没用
二楼回贴 基本没看懂楼主在说什么
三楼回贴,要么和二楼一样,要么你牛B你写一个
四楼回贴,也是不知道楼说在什么
四楼回贴,你说的楼主说的主题有关吗?

楼主说这个方法,我以前用过,原理是一样的   回复  引用    

#7楼  2008-06-05 22:23 BAsil      

能说一下用form验证有什么不同?   回复  引用  查看    

#8楼  2008-06-05 23:30 Ryan Gene      

楼主说的是一种方法

希望大家针对主题讨论,别对别人攻击,保持一种良好的氛围是很重要的,请大家珍惜。

btw,密码保存在cookie中一般是不推荐的

--Ryan   回复  引用  查看    

#9楼  2008-06-06 01:32 浪子      

Session存太久了,服务器压力太大^_^   回复  引用  查看    

#10楼  2008-06-06 08:12 efreer [未注册用户]

6楼,是个傻子,大家别怪!   回复  引用    

#11楼  2008-06-06 08:30 kevinlzf [未注册用户]

确实没用   回复  引用    

#12楼  2008-06-06 08:52 AAAA [未注册用户]

存个加密的凭证到Cookie就是了,如果不想自己搞加密配置一下webconfig也行.
为了进一步保证安全定期修改一下webconfig   回复  引用    

#13楼 [楼主] 2008-06-06 09:05 银河使者      

服务端一般可以对session持久化,也就是说,如果一个session长期没有被访问,就会被保存在文件中(数据库或其他文件),所以即使session长期存在,也只是占硬盘的地方。   回复  引用  查看    

#14楼  2008-06-06 10:26 westhot      

密码保存在cookie中 也没有意义
登录成功后,我们对页面验证一般也只验证用户是否为空,就像楼主的以下代码
if(session.getAttribute(user) != null)
{
// 直接forward到主界面
break;
}
不知大家是怎么做的?
呵呵 大家手下留情 不要扔 我鸡蛋 :)   回复  引用  查看    

#15楼 [楼主] 2008-06-06 10:37 银河使者      

不知道blogjava的自动登录是怎么做的,感觉第一次登录后,很好时间都可以自动登录。   回复  引用  查看    

#16楼  2008-06-06 11:37 大石头      

呵呵,最常用的做法。我说说别的我所知道的。

1,单点登录。如果应用系统没有保存登录,可以通过单点登录带动从而自动登录。这点我做过。

2,windows集成身份验证。这个方案适合启用了域和活动目录的企业内部系统。具体做法就不用说了吧。

3,USBKey。很多系统已经坐到能够读取USBKey从而自动登录。这个也非常简单。

一时间,只能想起这么多^_^   回复  引用  查看    

#17楼  2008-06-06 11:38 大力      

当服务器内存不足时session会丢失。个人感觉用session来保存重要的东西非常不可靠,很容易丢失。

要用session,建议启用ASP.NET State Service服务
  回复  引用  查看    

#18楼  2008-06-06 13:54 WOWO [未注册用户]

建议大家还是好好学习下企业级的BS开发,写几行程序容易,但是写出好的程序就很困难了;session的确会丢失,Cookie也的确不安全,楼主描述的,只会用在一般的网站中,在企业应用中会附加安全考虑的,建议大家学习下微软的几个例子……
呵呵,一个应用把服务器都搞得内存不足了,不是很可怕么?   回复  引用    

#19楼  2008-06-06 13:55 沙加      

Session没啥用处~~   回复  引用  查看    

#20楼 [楼主] 2008-06-06 14:07 银河使者      

session只是普通的内存对象,没什么特殊的。如果说会丢失,很可以是程序写的问题,甚至是服务器的bug。 如果程序中发现session会丢失,最好弄清楚是什么原因。 session绝对不会无缘无故地丢失。 这个世界上没有什么事是无缘无故发生的。 只有弄清楚原因,心里才会有底。否则,就算用再高级的技术,恐怕自己也是没底的。

至于本文的方法,只是抛砖引玉。 希望各位可以将自己知道的方法同大家分享。不要只说这个方法好,那个方法不好。 最好可以说明一下它们的好坏具体表现在哪里。这样才更有说服力。事实胜于一切雄辩!   回复  引用  查看    

#21楼 [楼主] 2008-06-06 14:20 银河使者      

另外session可以持久化到数据库中,不会都放到内存中的。   回复  引用  查看    

#22楼  2008-06-06 14:56 HedgeHog      

喷子很多啊.我以为只有nga才有喷子   回复  引用  查看    

#23楼  2008-06-06 18:55 JesseZhao      

Session配置起来可以实现很强大的功能
这篇文章如果能展开谢谢那个方面应该会更好   回复  引用  查看    

#24楼  2008-06-06 22:54 侦探 [未注册用户]

非常不建议有这样的功能噢,因为不安全   回复  引用    

#25楼  2008-06-06 23:09 李涛      

@侦探
自动登陆的功能很常见,关键是要看你怎么做,才安全!   回复  引用  查看    

#26楼 [楼主] 2008-06-07 10:28 银河使者      

如果依靠服务端进行控制,要比完全依赖客户端要安全一些。   回复  引用  查看    

#27楼  2008-06-07 21:15 koo [未注册用户]

一个自动登录还搞这么麻烦,保存到cookie不就行了。还有很讨厌什么持久化啊这些名堂,搞得很神秘似的。   回复  引用    


标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      


相关链接:
 


<2008年6月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

导航

统计

公告

我的其他Blog
http://nokiaguy.blogjava.net

与我联系

搜索

 

常用链接

留言簿(4)

我参与的团队

我的标签

随笔分类(115)

随笔档案(55)

相册

专家Blog

积分与排名

最新评论

阅读排行榜

评论排行榜

60天内阅读排行