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.pswp.cn/news/530560.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/530560.shtml
英文地址,請注明出處:http://en.pswp.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…