java session 永不过期_Java Web Application使Session永不失效(利用cookie隐藏登录)

在做 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 中的  (该方法本文未验证,网上搜集)

defaultSessionTimeOut="3600" isWARExpanded="true"

isWARValidated="false" isInvokerEnabled="true"

isWorkDirPersistent="false"/>

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

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[] cookies=ServletActionContext.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")){

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);

}returnactionInvocation.invoke();

}

}return "timeout";

}

}

}

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

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

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

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/530560.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java is-a_java中 is - a和 has - a的区别

Java中is-a和has-a的区别1.“is-a”是继承的关系,比如人是动物,人和动物是继承的关系;2.“has-a”是聚合的关系,比如人有眼睛,人和眼睛是聚合的关系;也可以理解为 is-a 是“继承”但has-a是“接口”关系。是“相互依赖”的关系,同时它们的生命周期都是一样的。我们以…

支付宝支付对账单java_[Java]解析支付宝对账单csv

配置相关公钥和私钥这些需要在支付宝的账户中心配置image.png这些内容在支付宝平台上都有教程,因为下载对账单这个功能比较简单,不需要入聚石塔下载对账单https://docs.open.alipay.com/20180417160701241302/fd3qt1官方文档写的很清楚,而且能直接用,将配置好的公钥私钥APPID等…

cmd编译java文件中文乱码_乱码 HelloWorld 世界你好 cmd 执行输出的中文java 显示乱码 解决 另附 win无法执行编译运行javac java编译文件的解决方案...

【博客园cnblogs笔者m-yb原创,转载请加本文博客链接,笔者公众号aandb7 爱码一生,QQ群927113708, github: https://github.com/mayangbo666】这是一篇java入门:java是众多编程语言之一, 就是开发的工具技术, 没什么特别, 是应用广, 严谨的语言…

java linux获取实时cpu_用java取得linux系统cpu、内存的实时信息(参考别人代码)...

/**   * cat /proc/cpuinfo - cpu (i.e. vendor, mhz, flags like mmx) * cat /proc/interrupts - 中断   * cat /proc/ioports - 设备io端口   * cat /proc/meminfo - 内存信息(i.e. mem used, free, swap size)   * cat /proc/partitions - …

自我学习--关于如何设计光耦电路

本人在项目中多次设计光耦电路,目前电路在项目中运行比较平稳,所以总结一下自己的设计经验,与大家交流一下,如有错误还希望大家指出改正,谢谢(V:Smt15921588263;愿与大家多交流&…

java 读取 xmltype_java操作XMLType的几种方法

XMLType是oracle数据库特有的数据类型可以用来存储一段xml,通过java(本文使用jdbc)插入XMLType根据sql中参数的类型通常有以下3种方法:本文使用的数据库为oracle10.2.1一、String,客户端只需传递一个字符串参数,创建xmltype的任务完全交给数据库,此方法数据库的压力最大String …

java运算符优先级举例_列举出java运算符的优先级

展开全部优先级 操作符 含义 关联性32313133353236313431303231363533e59b9ee7ad9431333337613833 用法----------------------------------------------------------------1 [ ] 数组下标 左 array_name[expr]. 成员选择 左 o…

java websocket ie8_websocket兼容IE8

最近由于项目需要做实时聊天功能,选择了html5的websocket方案(事实上node.jssocket.io兼容性更好,个人觉得这个方案更加完美),websocket实现实时聊天的demo网上很多,但是兼容IE8的资料却很少,这块折腾了很久。websoket…

java newfile() bug_java初学者小白?遇到BUG就慌了?有关java异常的十大问题详解!...

1.已检查与未检查简而言之,必须在方法中显式捕获已检查的异常,或在方法的throws子句中声明该异常。未检查的异常是由无法解决的问题引起的,例如被零除,空指针等。检查的异常特别重要,因为您希望使用API的其他开发人员知…

java 日期操作工具类_java8操作日期的工具类

java8操作日期的工具类一、方法概览该包的API提供了大量相关的方法,这些方法一般有一致的方法前缀:of:静态工厂方法。parse:静态工厂方法,关注于解析。get:获取某些东西的值。is:检查某些东西的…

mysql拦截器实现crud_Mybatis自定义SQL拦截器

本博客介绍的是继承Mybatis提供的Interface接口,自定义拦截器,然后将项目中的sql拦截一下,打印到控制台。先自定义一个拦截器package com.muses.taoshop.common.core.database.config;import org.apache.commons.lang3.StringUtils;import or…

python 桌面提醒_使用Python获取桌面通知

开发一款可提醒您诸如警报或待办事项清单等计划的应用程序真是太好了。在本文中,我将引导您逐步编写如何使用Python获取桌面通知的程序。桌面通知应用程序如何工作?您今天将要学习开发的桌面通知应用程序的主要目的是不断提醒我们我们一天中需要完成的不…

java线程同步的实现_【Java多线程系列三】实现线程同步的方法

packagecom.concurrent.test;importjava.util.Stack;importjava.util.concurrent.ArrayBlockingQueue;importjava.util.concurrent.BlockingQueue;importjava.util.concurrent.locks.Condition;importjava.util.concurrent.locks.ReentrantLock;/*** Description: 三种方法实现…

python建立py文件夹过程_Pycharm创建python文件自动添加日期作者等信息(步骤详解)...

百度AI接口的调用方法不必多介绍。官网地址 人流量统计新建AipBodyAnalysisfrom aip import AipBodyAnalysis""" 你的 APPID AK SK """APP_ID 你的 App IDAPI_KEY 你2021-02-03 14:24:01本文主要介绍了在python3.9下如何安装scrapy的方法&…

python父亲节祝福_父亲节祝福语精选简短 父亲节祝福语简短独特

1.您的坚忍不拔和铮铮硬骨是我的榜样,我从您那儿汲取到奋发的力量,走过挫折,迈向成功,爸爸,您是我永远的榜样,我爱您!祝您节日快乐!2.您的怀抱,是我的小天地;…

redis java应用_redis在JAVA的简单应用

reids是一个高性能的key-value数据库。它存储的value支持各种类型的数据,如String,List,set,hash类型。在此基础上,各种不同方式的排序。本文不具体争对redis数据库的各种命令,而是在Java实现简单的调用。1. //初始化R…

java安装 hello_安装JAVA步骤,并编写HELLOWORLD程序

安装Java步骤,并编写helloworld程序1.安装JDK(Java Development Kit)JDK是Java开发工具包(Java Development Kit)的缩写。它是一种用于构建在J Java 平台上发布的应用程序、applet和组件的开发环境。即编写Java程序必须有JDK,它提供了编译Java和运行Java…

java实现Fmeasure计算_聚类结果的评估指标及其JAVA实现

一. 前言又GET了一项技能。在做聚类算法的时候,由于要评估所提出的聚类算法的好坏,于是需要与一些已知的算法对比,或者用一些人工标注的标签来比较,于是用到了聚类结果的评估指标。我了解了以下几项。TP:是指被聚在一类的两个量被…

java随机产生坐标点_刚学JAVA不久,问一下怎么把这个程序实现随机啊,不是按照坐标...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼int i;int z0;int j,h0,k0;int AppletWidch,AppletHeight,currentImage;Image Animation[],SerialImage,OffScreen;Thread newThread;Graphics drawOffScreen;MediaTracker MT;ImageProducer Source;CropImageFilter CutImage;publ…

ubuntu安装java的rpm_ubuntu安装jdk-6u45-linux-x64-rpm.bin

1、参考网址:ZC: 网页内容保存于 “百度云 CodeSkill33 --> 全部文件 >来自网页 > Linux > ubuntu > ubuntu安装jdk-6u45-linux-x64-rpm.bin__Work_20160115_0851.rar”2、(1)、我是将jdk-6u45-linux-x64.bin放在 "/home"下的(2)、命令&qu…