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