在做 Web Application 时,因为 Web Project 有 session 自动失效的问题,所以如何让用户登录一次系统就能长时间运行三个月,就是个问题。

  后来,看到 session 失效的拦截器代码,就猜想能否通过拦截器来实现。

  查资料发现可行:用户登录时将帐号密码存入cookie,cookie可以存储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.setMaxInactiveInterval

2. 项目的web.xml 中的 session-timeout (验证有效)

3. Tomcat 的 server.xml 中的  (该方法本文未验证,网上搜集)

<Context path="/livsorder" docBase="/home/httpd/html/livsorder"
  defaultSessionTimeOut="3600" isWARExpanded="true"
  isWARValidated="false" isInvokerEnabled="true"
  isWorkDirPersistent="false"/>

4. Tomcat 的 web.xml 中的 (该方法本文未验证,网上搜集)

<session-config>
<session-timeout>30</session-timeout>
</session-config>

分别对应:

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); //创建或覆盖COOKIE
Cookie 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. 拦截器代码

package com.tools;

import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpSession; import org.apache.struts2.ServletActionContext;
import org.apache.struts2.StrutsStatics;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils; import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
import com.zhzx.class_entity.User;
import com.zhzx.service.UserService; @SuppressWarnings("serial")
public class MyInterceptor implements Interceptor { public void destroy() {
} public void init() {
} public String intercept(ActionInvocation actionInvocation) throws Exception { // 确认Session是否过期
Map strutSession = actionInvocation.getInvocationContext().getSession();
Cookie[] cookies = ServletActionContext.getRequest().getCookies(); User us=(User) strutSession.get("user");
String userName = "";
String userPwd = ""; if (us!=null&&!"".equals(us)) {
return actionInvocation.invoke();
} else {
//从cookie得到登录账户
if(cookies != null){
for(Cookie cookie:cookies){
if(cookie.getName().equalsIgnoreCase("jsjgUserName")){
userName = cookie.getValue();
System.out.println(userName);
}else if(cookie.getName().equalsIgnoreCase("jsjgUserPwd")){
userPwd = cookie.getValue();
}
}
//登录
if(userName != null && userPwd != null){ //因项目使用了SSH,所以这里是获取Spring管理的bean
ServletContext context = (ServletContext) actionInvocation.getInvocationContext().get(StrutsStatics.SERVLET_CONTEXT);
ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(context);
UserService userService = (UserService)ctx.getBean("UserService"); //是否注入成功
System.out.println(userService); //登录并放入Strtu2包装的session
User user=userService.Login(userName);
if(user != null && user.getPassword().toLowerCase().equals(userPwd.toLowerCase())){
strutSession.put("user", user);
} return actionInvocation.invoke();
} }
return "timeout";
}
} }

然后拦截器按照常规方法使用即可。拦截器可以看看 Struts in Action ,Struts实战之类的书及PDF,有详细的讲解和例子。

吐槽:Java是太庞杂了,框架多不说,使用起来也方法各样,一会儿流行配置文件,一会儿流行注解,一会SSH,一会SSM,一会Sping MVC。

我就想说这不都是自己折腾自己么,学习成本不是成本么,发明出这么多轮子,软件行业不还是加班。旧的软件项目不还是要维护。

Java体系真是自己折腾自己,真心无爱了。

我觉得框架只是工具,就像武侠世界里,真正的高手是用什么工具都可以杀人于无形,那管你是用很多人鄙视的 ASP.NET 还是自以为很牛逼的Java Web,

甲方和老板关心的无非是你做完了么,做的好看么,是不是?

程序员,工程师们还是消停点好,多关心下自己的健康和身边的人不好么?

Java Web Application使Session永不失效(利用cookie隐藏登录)的更多相关文章

  1. A candidate solution for Java Web Application - current session

    Motivation Do it once, resue for ever. Audience myself, Java Web developers Scope 应用案例 图书借阅系统 阶段1需求: ...

  2. ThreadLocal Memory Leak in Java web application - Tomcat

    ThreadLocal variables are infamous for creating memory leaks. A memory leak in Java is amount of mem ...

  3. Python3之利用Cookie模拟登录

    Python3之利用Cookie模拟登录 利用Cookie模拟登录步骤: 1.       在浏览器输入http://demo.bxcker.com,输入用户名和密码登录. 2.登录成功点" ...

  4. 【Web】关于Session过期/失效的理解

    一直好奇关于Session的过期,一种说法是关闭浏览器即Session失效,另一种说法是可以设置Session的过期时间,时间到了自动过期. 这两种说法到底是怎么回事?Session过期跟Cookie ...

  5. Asp.net 子web application的Session共享

    需求提出: 网站: 父Web Application: http://www.test.com/ 子Web Application 1: http://www.test.com/child1 子Web ...

  6. 如何使Session永不过期

    转载:http://blog.csdn.net/wygyhm/article/details/2819128 先说明情况:公司做监控系统,B/S结构,主要用在局域网内部!监控系统开机可能要开好长时间, ...

  7. java web学习总结(十一) -------------------基本概念使用Cookie进行会话管理

    一.会话的概念 会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. 有状态会话:一个同学来过教室,下次再来教室,我们会知道这个同学曾 ...

  8. Java Web学习总结(8)——使用Cookie进行会话管理

    一.会话的概念 会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. 有状态会话:一个同学来过教室,下次再来教室,我们会知道这个同学曾 ...

  9. Centos + nginx + JBOSS AS 7 搭建Java web application

    最近做了一个Java的web app,一直想在Centos环境中搭建一个完整的web服务器,现在开始动手. 先说说环境: 操作系统: Centos 6.3 WEB服务器: nginx-1.2.5 Ap ...

随机推荐

  1. JAVA之反射(一)

    反射(一) ** 注:博主的这篇文章是在学习反射的时间写的如有问题请及时联系博主进行修改 ** 何为反射  这里也不说一些很官方的语言了,官方的说明看着头痛,总之一句话,就是在JAVA的运行状态的时候 ...

  2. 继承、super、this、抽象类

    继承.super.this.抽象类 继承.super.this.抽象类 继承.super.this.抽象类 继承.super.this.抽象类 继承.super.this.抽象类

  3. 由奇葩cookie导致服务器500来认识cookie

    问题:cookie中文会导致服务器报500错误. 一:cookie的特点 1.以键值对的形式出现的,比如:a=b;b=c 2.中文的值需要转义 cookie的例子 <!DOCTYPE html& ...

  4. poj1082 Calendar Game (博弈)

    题意是:Adam和Eve两人做游戏,开始给出一个日期,截止日期是2011.11.4,游戏规则如下: 每个人只能将天数增加一天或者将月份增加一天.如果下个月没有这一天,那么只能增加天数. 游戏胜利定义为 ...

  5. 同源策略与CORS跨域请求

    一.同源策略 1.简介 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可以说Web是构建在同源 ...

  6. 15-----jQuery补充

    jquery除了咱们上面讲解的常用知识点之外,还有jquery 插件.jqueryUI知识点 jqueryUI 官网: https://jqueryui.com/ jqueryUI 中文网: http ...

  7. sql For update

    for update 的作用和目的:select for update 是为了在查询时,对这条数据进行加锁,避免其他用户以该表进行插入,修改或删除等操作,造成表的不一致性. 几个类似的场景: sele ...

  8. python入门之sys模块、shutil模块

    sys模块 import sys sys.version 返回python的版本 sys.argv 返回一个以脚本名,和传入的参数作为元素的列表 sys.path 返回一个以当前代码文件路径,pyth ...

  9. python3+Appium自动化05-xpath定位

    概念 xpath定位是一种路径定位方式,主要是依赖于元素绝对路径或者相关属性来定位,但是绝对路径xpath执行效率比较低(特别是元素路径比较深的时候),一般使用比较少.通常使用xpath相对路径和属性 ...

  10. 利用Python进行数据分析 2017 第二版 项目代码

    最近在学习<利用Python进行数据分析>,找到了github项目的地址, 英文版本,中文版本 (非常感谢翻译中文的作者). mark一下,方便后边学习查找.