如何开发网站自己做站长,wordpress文章末尾添加相关文章,网站开发后期维护更新,眼镜网站模板在做 Web Application 时#xff0c;因为 Web Project 有 session 自动失效的问题#xff0c;所以如何让用户登录一次系统就能长时间运行三个月#xff0c;就是个问题。后来#xff0c;看到 session 失效的拦截器代码#xff0c;就猜想能否通过拦截器来实现。查资料发现可…在做 Web Application 时因为 Web Project 有 session 自动失效的问题所以如何让用户登录一次系统就能长时间运行三个月就是个问题。后来看到 session 失效的拦截器代码就猜想能否通过拦截器来实现。查资料发现可行用户登录时将帐号密码存入cookiecookie可以存储1年至更久当session失效被拦截时在拦截器内读取cookie 中的用户名和密码后再登录。(登录过程隐藏对用户不可见)。在实践过程中遇到个问题 在拦截器内重新实现登录过程(包括写session)此时写session是成功的但是返回被拦截器拦截的 Action 方法内时Action 内的方法读取的session却是空的。(2017-06-12 更新出错原因是保存的sesion和读取的session分别是Strut2包装的session和JSP/Sevlert内置的session导致读取为空参见)方法一设置 session-timeout 参数值最简单的办法是在Java Web 中可通过设置 web.xml 中的 session-timeout 为 -1 即可实现 session 永不失效。Java Web中有关 Session 失效的设置有三处1. 页面或者代码内通过 session.setMaxInactiveInterval2. 项目的web.xml 中的 session-timeout (验证有效)3. Tomcat 的 server.xml 中的 (该方法本文未验证网上搜集)defaultSessionTimeOut3600 isWARExpandedtrueisWARValidatedfalse isInvokerEnabledtrueisWorkDirPersistentfalse/4. Tomcat 的 web.xml 中的 (该方法本文未验证网上搜集)30分别对应1. 当前会话生效2. 整个Web应用有效3. 不详4. 不详设置产生效果的优先顺序很显然是1 - 2 没有指明就是用默认设置。另外 setMaxInactiveInterval的参数是秒session-config当中配置的session-timeout是分钟。 设置session-timeout是永久有效。【setMaxInactiveInterval(-1)也是元永久有效(本人未测试)】。测试是否是永久有效很简单只需要在本地测试(localhost)时将本机的时间调整为几个月之后即可。但在实际使用中并不理想因为超出 tomcat 的默认是 30 分钟如果修改 tomcat 默认值会影响其他项目不说也很容易遗忘对今后产生莫名其妙的问题。方法二使用 Struts2 拦截器原理在使用了 Struts 框架的代码中使用拦截器测试Session 是否为空若是空利用 cookie 里藏的用户名和密码进行登录并保存到 session 中。代码(本人亲测实际使用)1. 登录保存到 Struts2 包装的 session中(注意前后session要对应)根据项目需要可决定是否加密。我示例未加密。//你的登录方法内部//user 是登录成功后的用户对象ActionContext.getContext().getSession().put(user, user);//创建或覆盖COOKIECookie ckName new Cookie(jsjgUserName, username);Cookie ckPwd new Cookie(jsjgUserPwd, password);ckName.setMaxAge(365*24*60*60);ckPwd.setMaxAge(365*24*60*60);response.addCookie(ckName);response.addCookie(ckPwd);2. 拦截器代码packagecom.tools;importjava.util.Map;importjavax.servlet.ServletContext;importjavax.servlet.http.Cookie;importjavax.servlet.http.HttpSession;importorg.apache.struts2.ServletActionContext;importorg.apache.struts2.StrutsStatics;importorg.springframework.context.ApplicationContext;importorg.springframework.web.context.support.WebApplicationContextUtils;importcom.opensymphony.xwork2.ActionInvocation;importcom.opensymphony.xwork2.interceptor.Interceptor;importcom.zhzx.class_entity.User;importcom.zhzx.service.UserService;SuppressWarnings(serial)public class MyInterceptor implementsInterceptor {public voiddestroy() {}public voidinit() {}public String intercept(ActionInvocation actionInvocation) throwsException {//确认Session是否过期Map strutSession actionInvocation.getInvocationContext().getSession();Cookie[] cookiesServletActionContext.getRequest().getCookies();User us(User) strutSession.get(user);String userName ;String userPwd ;if (us!null!.equals(us)) {returnactionInvocation.invoke();}else{//从cookie得到登录账户if(cookies ! null){for(Cookie cookie:cookies){if(cookie.getName().equalsIgnoreCase(jsjgUserName)){userNamecookie.getValue();System.out.println(userName);}else if(cookie.getName().equalsIgnoreCase(jsjgUserPwd)){userPwdcookie.getValue();}}//登录if(userName ! null userPwd ! null){//因项目使用了SSH所以这里是获取Spring管理的beanServletContext context (ServletContext) actionInvocation.getInvocationContext().get(StrutsStatics.SERVLET_CONTEXT);ApplicationContext ctxWebApplicationContextUtils.getWebApplicationContext(context);UserService userService (UserService)ctx.getBean(UserService);//是否注入成功System.out.println(userService);//登录并放入Strtu2包装的sessionUser useruserService.Login(userName);if(user ! null user.getPassword().toLowerCase().equals(userPwd.toLowerCase())){strutSession.put(user, user);}returnactionInvocation.invoke();}}return timeout;}}}然后拦截器按照常规方法使用即可。拦截器可以看看 Struts in Action Struts实战之类的书及PDF有详细的讲解和例子。吐槽Java是太庞杂了框架多不说使用起来也方法各样一会儿流行配置文件一会儿流行注解一会SSH一会SSM一会Sping MVC。我就想说这不都是自己折腾自己么学习成本不是成本么发明出这么多轮子软件行业不还是加班。旧的软件项目不还是要维护。Java体系真是自己折腾自己真心无爱了。我觉得框架只是工具就像武侠世界里真正的高手是用什么工具都可以杀人于无形那管你是用很多人鄙视的 ASP.NET 还是自以为很牛逼的Java Web甲方和老板关心的无非是你做完了么做的好看么是不是程序员工程师们还是消停点好多关心下自己的健康和身边的人不好么