假如这个世界上只剩下你一个人,当你正坐在屋子里的时候,这时突然响起了敲门声...

实现Web程序的自动登录

上一篇 / 下一篇  2008-06-09 18:54:57 / 个人分类:web

查看( 347 ) / 评论( 7 )
本文为原创,如需转载,请注明作者和出处,谢谢!
_eV;[L%Q6ez$i(AR0ITPUB个人空间CZi(~"d/zw![
    有很多Web程序中第一次登录后,在一定时间内(如2个小时)再次访问同一个Web程序时就无需再次登录,而是直接进入程序的主界面(仅限于本机)。实现这个功能关键就是服务端要识别客户的身份。而用Cookie是最简单的身从验证。
W!y ODa\'F0z*k0
Sjgj'ws8D&I:z&BVe0如果用户第一次登录,可以将用户名作为Cookie写到本地,代码如下:
V*]6myP"_:G0
;c+\}1jQZ6rc U0Cookie cookie = new Cookie("user", user);ITPUB个人空间i6^o-HF
cookie.setMaxAge(365 * 24 * 3600);
PMNy'Ca9d;H \!j f0cookie.setPath("/");ITPUB个人空间 L)N-v,X7QT2?M
response.addCookie(cookie);ITPUB个人空间5l7dt$UUk3CF
ITPUB个人空间k-B7~QRr i4xb.e
    当用户再次访问程序时,服务端程序应该检测这个Cookie是否存在,代码如下:
8ih"fk!b,l"O(]v0b0
$F9\7s D#w/P-v0Cookie[] cookies=request.getCookies();
W)NQ)MX[Z4yG0for(Cookie cookie: cookies)
3xe/^*A&ncY6zd0{
Zi-a[}5G%pF0    if(cookie.getName().equals(user))ITPUB个人空间\h2rY;|9i
    {
7]Y7CY5{s0        // 如果user Cookie存在,进行处理ITPUB个人空间bKQ#?+t
        break;ITPUB个人空间WW"eF/sk"t
    }ITPUB个人空间6c9L:ku |,n\t
}
.A(D6Y-Q(|K d7v*{0
F8| ?9n w8Z+q3Y/O1qa0    尽管从客户端可以获得User Cookie,但这上Cookie可能存在很长时间,而且仅凭这个Cookie就自动登录并不安全,因此,可以在服务端使用一个Session来管理用户。也就是当第一次登录成功后,就创建一个Session,并将用户的某些信息保存在Session顺。代码如下:ITPUB个人空间*y!cD.}"GC1\(Uu

)h ozD@3q o gC0}:X g0HttpSession session =request.getSession();
~ Dp.YHk+M\0session.setAttribute(user, user);
+]at$C;K,aH0session.setMaxInactiveInterval(2 * 3600);  // Session保存两小时
S1Y3tz2{|0
*H"gfDaVn0     当再次访问程序时,确定了cookie存在后,就会继续验证User Session的存在,代码如下:
:`PC%n`8R D1?0ITPUB个人空间 q8t7jyY&O'D K#i
Cookie[] cookies=request.getCookies();
'| `,?1v N:F2m*sZ0for(Cookie cookie: cookies)ITPUB个人空间$UTa$uCC.?
{
9^4?%t9B%[%N'|!I.V0    if(cookie.getName().equals(user))
|wP] ^UO.P{0    {
@6n+f9DAk@#L9t+T0        if(session.getAttribute(user) != null)
eN7[xMka0        {
x(E\nr;`nM0            // 直接forward到主界面
/N)G;h4_So"B0           break;ITPUB个人空间)E^t(^9p
        }
tED.Y{f l0`0        elseITPUB个人空间o7PY)W t
        {ITPUB个人空间4E EJE4wv
            // forward到登录界面ITPUB个人空间%E@nS)m+}Z`
         }
&ZZ9qKE0     }
x'pYl9~ j/d0}ITPUB个人空间x{zJkG1P
ITPUB个人空间:M:n j&A{;{
    虽然上面的代码可以很好地实现自动登录功能,但是当浏览器关闭,再次启动后,由于Servlet用于保存Session ID的JSESSIONID Cookie是临时的(也就是说不是持久Cookie,当浏览器关闭后,这个Cookie就会被删除),因此,需要将JSESSIONID进行持久化。代码如下:ITPUB个人空间@"iro'N"e$D7|

9X)N'g2wr&s$m'|0HttpSession session = request.getSession();ITPUB个人空间 `\-G({I*A
session.setAttribute(user, user);ITPUB个人空间 l@&P_8@W.?#y
session.setMaxInactiveInterval(2 * 3600);  // Session保存两小时ITPUB个人空间5EYnVx*iP
Cookie cookie = new Cookie("JSESSIONID", session.getId());ITPUB个人空间4[D+HC8x)x#_+Fz
cookie.setMaxAge(2 * 3600);  // 客户端的JSESSIONID也保存两小时
4k3j#`P.S?%@ V/M:R0session.setMaxInactiveInterval(interval)ITPUB个人空间Kn2f2{z3kZ&^:d
cookie.setPath("/");        ITPUB个人空间t%YX8rL/Kc
response.addCookie(cookie);ITPUB个人空间!c4d!brj*v){WT

%L!a%C%V HWd3G0    如果使用上面的代码,即使浏览器关闭,在两小时之内,Web程序仍然可以自动登录。ITPUB个人空间7L'YzY'zyO

`,X _5[ SM(D6^0    如果我们自已加一个JSESSIONID Cookie,在第一次访问Web程序时,HTTP响应头有两个JSESSIONID,但由于这两个JSESSIONID的值完全一样,因此,并没有任何影响。如果在响应头的Set-Cookie字段中有多个相同的Cookie,则按着path和name进行比较,如果这两个值相同,则认为是同一个Cookie,最后一个出现的Cookie将覆盖前面相同的Cookie,如下面的两个Cookie,最后一个将覆盖前一个:
b*[1tG,c0
AR#\Dp @G z7\0Set-Cookie: JSESSIONID=DDB2274CAC6739E1D6747B0043D5D90E; Path=/webITPUB个人空间\C$J,qbR`
ITPUB个人空间:r9s@ j8aw1z4d{%y
Set-Cookie: JSESSIONID=mysession; Expires=Thu, 05-Jun-2008 05:02:50 GMT; Path=/webITPUB个人空间K:J_Z2pIi2dw2`/t&X
ITPUB个人空间7N:M3Prj%K G.`xm
    由于下面两个Cookie的path不同,因此,它们是完全不同的两个Cookie:ITPUB个人空间E7s#{C[}:}T!Z

6t#G8Wm8wl T0Set-Cookie: JSESSIONID=DDB2274CAC6739E1D6747B0043D5D90E; Path=/web1
]vPCj\e0
xWX5N#z.P t0Set-Cookie: JSESSIONID=mysession; Expires=Thu, 05-Jun-2008 05:02:50 GMT; Path=/web2
9d2xEw V9Y4]8lF2k0
.y/bl)J`.e\&}0谁有其他的方法(可以是任何语言或技术)实现自动登录,请跟贴!

TAG: java web

Sky-Tiger的个人空间 Sky-Tiger 发布于2008-06-09 20:30:34
GOOD! nice job!
javalod发布于2008-06-12 11:35:54
用户禁用cookies
如何解决
向来自遥远星系的勇士致敬 银河使者 发布于2008-06-12 12:05:23
禁用cookies,只是用户名在客户端保存不了,但是session可以通过url方式解决
showmetheway的个人空间 showmetheway 发布于2008-06-13 11:20:15
学习
伤悲的傻子发布于2008-06-15 22:10:12
感觉这东西没啥作用,公用的机子就不安全了,
F$O/G AEVL6}9Q再者,页面关了的话Session就找不到了的,ITPUB个人空间FF}b&u
M6?

要实现这东西也应该很简单,服务器端记录IP及时间及登录的用户信息, 用个JOB自动清掉过期的用户信息, 登录后查IP,在里面就更新时间及直接跳转,不在的话创建一下
向来自遥远星系的勇士致敬 银河使者 发布于2008-06-16 11:10:52
首先,应尽量避免在公共的机器上使用带有敏感信息的程序。否则后果自负。space.itpub.net Yd0@&H#n
4|@3t U
m$hjUL
w(k

还有就是可以将sessionid保存在本地的cookie,就算页面关了,也会起作用T"s0IJ&[3[`4v SG6QoDk

$g*s9R NAUspace.itpub.net如果想更安全,就只有通过硬件加密了。在登录时需要一个usb口的加密锁才能自动登录。那如果锁都丢了,就只能认倒霉了。
ruian123456的个人空间 ruian123456 发布于2008-06-17 14:31:41
6楼有没有具体的例子,发上来让偶也学下
我来说两句

(可选)

日历

« 2008-10-14  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 12458
  • 日志数: 119
  • 建立时间: 2008-02-08
  • 更新时间: 2008-10-01

RSS订阅

Open Toolbar