日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java session 超时_Javaweb项目session超时解决方案

發布時間:2023/12/10 java 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java session 超时_Javaweb项目session超时解决方案 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在Java Web開發中,Session為我們提供了很多方便,Session是由瀏覽器和服務器之間維護的。Session超時理解為:瀏覽器和服務器之間創建了一個Session,由于客戶端長時間(休眠時間)沒有與服務器交互,服務器將此Session銷毀,客戶端再一次與服務器交互時之前的Session就不存在了。

0.需求

需要對所有的/web/**請求進行登錄攔截,Session超時時跳轉到登錄頁面。

1.引入

一般來說,在項目使用中都會配置Session超時時間,如果不配置,則默認值為30分鐘,即用戶不操作30分鐘以后,Session就會失效,此時用戶就需要重新登錄系統。

Session超時時間的配置主要的項目的web.xml中進行配置,如下:

60

COOKIE

2.請求的分類

現在的項目中請求主要分為兩種:一種是普通請求,即發起請求返回視圖和模型;另外一種是Ajax請求,主要返回模型數據。后端進行處理時就要根據不同的請求返回不同的內容。

對于普通請求,我們直接返回JavaScript腳本,腳本內容可以是將頁面跳轉到登錄頁面。

對于Ajax請求,則需要返回非200的狀態碼,這樣ajax請求才會進入到error回調函數中以及全局的Ajax錯誤回調函數AjaxError中。

3.后端處理Session超時

后端采用SpringMVC的攔截器處理,這里為什么用攔截器呢?一方面,請求URL不能限制的太死,比如/*,這樣對所有的請求都進行過濾是浪費資源的。另一方面,有些URL不需要進行攔截處理,比如到登錄頁面的請求肯定是不能攔截,要不然會循環重定向。再一方面,我們只需要攔截控制器請求,其它請求不攔截。

下面看一下攔截器的實現:

/**

* Web端登錄攔截器

* 處理請求時Session失效的問題,包含Ajax請求和普通請求

* @ClassName WebLoginInterceptor

* @author zhangshun

* @date 2016年10月20日 上午11:14:52

*/

public class WebLoginInterceptor extends HandlerInterceptorAdapter{

/**

* 日志對象

*/

private Logger logger = LoggerFactory.getLogger(WebLoginInterceptor.class);

/**

* 默認注銷URL

* 即Session超時后,發起請求到此地址,只對普通請求有效

*/

private static final String DEFAULT_LOGOUT_URL = "/web/logout";

/**

* 注銷URL

*/

private String logoutUrl;

@Override

public boolean preHandle(HttpServletRequest request, HttpServletResponse response,

Object handler) throws Exception {

User user = SessionUtils.getUserFromRequestAcrossCas(request);

String uri = request.getRequestURI();

if(user == null){

response.setContentType("text/html;charset=UTF-8");

if(request.getHeader("x-requested-with") != null

&& request.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")){

// Ajax請求, 前段根據此header進行處理

response.setHeader("sessionTimeout", "Session time out, you need relogin !");

// 返回未認證的狀態碼(401)

response.setStatus(HttpStatus.UNAUTHORIZED.value());

logger.debug("請求路徑:" + uri + ", 請求方式 :Ajax請求, Session超時, 需要重新登錄!");

}else{

// 普通請求

String path = request.getContextPath();

StringBuffer basePath = new StringBuffer()

.append(request.getScheme())

.append("://")

.append(request.getServerName())

.append(":")

.append(request.getServerPort())

.append(path)

.append("/");

StringBuffer responseStr = new StringBuffer()

.append("

.append("window.location.href=\"")

.append(basePath).append(getLogoutUrl()).append("\";")

.append("");

response.getWriter().write(responseStr.toString());

logger.debug("請求路徑:" + uri + ",請求方式 :普通請求, Session超時, 需要重新登錄!");

}

return false;

}

return true;

}

public String getLogoutUrl() {

// 使用默認值

if(StringUtils.isEmpty(logoutUrl)){

return DEFAULT_LOGOUT_URL;

}

return logoutUrl;

}

public void setLogoutUrl(String logoutUrl) {

this

}

通過獲取Session中的User對象是否存在來判斷Session是否超時,如果Session超時,則根據不同的請求方式進行返回。如果是普通請求,則直接返回JavaScript腳本,該腳本可以將頁面跳轉到其它URL。如果是Ajax請求,則返回401狀態碼,并且在返回的header中加入sessionTimeout,該數據將會在前端使用。

該攔截器在SpringMVC配置文件中的配置如下:

4.前端處理Session超時

對于普通請求,后端返回的是JavaScript腳本,會立刻執行,這里前端不需要任何處理。

對于Ajax請求,后端返回401狀態碼,并在header中設置的sessionTimeout。這里使用jQuery的ajaxComplete回調函數處理,具體如下:

// 實現ajax請求時判斷Session是否失效

$(document).ajaxComplete(function(event, response, settings) {

var sessionTimeout = response.getResponseHeader("SessionTimeout");

if(sessionTimeout != null && typeof sessionTimeout != "undefined" && sessionTimeout.length > 0){

// 這里寫Session超時后的處理方法

}

});

好了,可以了,Session超時的用戶都會得到處理。

總結

關于Javaweb項目session超時解決方案就到這里,希望對大家有所幫助。

總結

以上是生活随笔為你收集整理的java session 超时_Javaweb项目session超时解决方案的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。