昨天学CSDN搞了跟两周内不用登陆,通过Cookie实现,实际就是如下几步:
1.登陆时产生Cookie, 设置过期时间为两周后。Tapestry对应的代码如下:
@Inject private Request request; @Inject private RequestGlobals requestGlobals; Object onSubmitFromloginForm() { saveLoginInfo(); user=? //get user from database } private void saveLoginInfo() { Cookie cookie = new Cookie("user", "true"); String contextPath = request.getContextPath(); cookie .setPath(contextPath != null && contextPath.length() > 0 ? contextPath : "/"); cookie.setMaxAge(60*60*24*7*2); cookie.setSecure(request.isSecure()); requestGlobals.getHTTPServletResponse().addCookie(cookie); }
当然重点是 saveLoginInfo方法。 顺便提下, Tapestry的注入功能确实强大,方便。
2. 当跳转到Login页面是,检查Cookie是否过期,如果没有,则跳过登陆。
@Inject private Cookies cookies; Object onActivate() { String userId=cookies.readCookieValue("user"); if(userId==null){ return null; //If no login Cookie, keep on Login page } if(user==null){ user = ? //get user from database. if (user != null l) { return null; } } return Main.class; // or else, go to main page. }
其实,这两步就已经完成了两周内不用登陆的要求了。
但是,我的网站还有个 注销功能,就是删除cookie。 代码如下
cookies.removeCookieValue("user")
现在郁闷的事情发生了了,无论我如何点 Log out, 总是注销不了,似乎这个user Cookie总是存在,没有办法remove. 结果我试了一招,清除浏览器的 历史记录 (其实就是清除Cookie), 结果我的Log out生效了!
分析原因如下: 这个user Cookie的名字太平常了,可能有其他某个同域的网站也有这个Cookie, 只要那个网页不关掉,这个Cookie就一直生效。 当然这只是猜测而已。没有证明,问题也不能重现,故可以猜测不对。
无论如何,我决定用一个不太常用的cookie名字....也请有类似经验的兄弟们,说说你们的意见。
-----------------------------------------------------
-----------------------------------------------------
经进一步研究发现,不是Cookie同名的问题。而是Tapesty5的Bug, 确实是因为Cookie没有删除。 经过我的试验,这个
cookies.removeCookieValue("user");
仅能在网站是根目录的情况才生效, 如 http://localhost:8080/Main , 如果变成 http://localhost:8080/MySystem/Main 就不生效了。这也是为什么我用jetty开发调试时没有问题,但是部署到服务器就有问题的原因。在Tapestry的Wiky上找到了方法。使用如下这段代码删除Cookie.
private void delLoginInfo() { // cookies.removeCookieValue(“user”); Cookie cookie = new Cookie( Start.loginCookie, null); String contextPath = request.getContextPath(); cookie .setPath(contextPath != null && contextPath.length() > 0 ? contextPath : "/"); cookie.setMaxAge(0); cookie.setSecure(request.isSecure()); requestGlobals.getHTTPServletResponse().addCookie(cookie); }