這篇文章主要介紹了Javaweb專案session超時解決方案,關於解決方案分類比較明確,內容詳細,需要的朋友可以參考下。
在Java Web開發中,Session為我們提供了許多方便,Session是由瀏覽器和伺服器之間維護的。 Session超時理解為:瀏覽器和伺服器之間創建了一個Session,由於客戶端長時間(休眠時間)沒有與伺服器交互,伺服器將此Session銷毀,客戶端再一次與伺服器交互時之前的Session就不存在了。
0.需求
需要對所有的/web/**請求進行登入攔截,Session逾時時跳到登入頁面。
1.引入
一般來說,在專案使用中都會配置Session逾時時間,如果不配置,則預設值為30分鐘,即使用者不操作30分鐘以後,Session就會失效,此時使用者就需要重新登入系統。
Session逾時時間的配置主要的項目的web.xml中進行配置,如下:
<span style="font-size: 14px;"> <!-- 设置Session超时时间 --> <session-config> <!-- 分钟 --> <session-timeout>60</session-timeout> <!-- 去除URL上显示的jsessionid, 防止打开Tab页时出现JS错误 --> <tracking-mode>COOKIE</tracking-mode> </session-config></span><span style="font-size:24px;"> </span>
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("<html><header><script type=\"text/javascript\">") .append("window.location.href=\"") .append(basePath).append(getLogoutUrl()).append("\";") .append("</script></header></html>"); 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設定檔中的配置如下:
<span style="font-size:14px;"><!-- MVC拦截器 --> <mvc:interceptors> <!-- Web登录拦截器 --> <mvc:interceptor> <mvc:mapping path="/web/**"/> <mvc:exclude-mapping path="/web/index"/><!-- 防止循环重定向到首页 --> <mvc:exclude-mapping path="/web/login"/> <mvc:exclude-mapping path="/web/logout"/> <mvc:exclude-mapping path="/web/doLogin"/> <bean class="com.woyi.mhub.interceptor.WebLoginInterceptor"/> </mvc:interceptor> </mvc:interceptors></span><span style="font-size:24px;"> </span>
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超時的問題解決的詳細內容。更多資訊請關注PHP中文網其他相關文章!

问题发现springboot项目生产session-out超时问题,描述下问题:在测试环境通过改动application.yaml配置session-out,经过设置不同时间验证session-out配置生效,于是就直接设置了过期时间为8小时发布到了生产环境。然而中午接到客户反应项目过期时间设置较短,半小时不操作就会话过期需要反复登陆。解决处理开发环境:springboot项目内置Tomcat,所以项目中application.yaml配置session-out是生效的。生产环境:生产环境发布是

php session刷新后没有了的解决办法:1、通过“session_start();”开启session;2、把所有的公共配置写在一个php文件内;3、变量名不能和数组下标相同;4、在phpinfo里面查看session数据的存储路径,并查看该文件目录下的sessio是否保存成功即可。

session php默认失效时间是1440秒,也就是24分钟,表示客户端超过24分钟没有刷新,当前session就会失效;如果用户关闭了浏览器,会话就会结束,Session就不存在了。

1.基于session实现短信登录1.1短信登录流程图1.2实现发送短信验证码前端请求说明:说明请求方式POST请求路径/user/code请求参数phone(电话号码)返回值无后端接口实现:@Slf4j@ServicepublicclassUserServiceImplextendsServiceImplimplementsIUserService{@OverridepublicResultsendCode(Stringphone,HttpSessionsession){//1.校验手机号if

当您在使用PHP会话(Session)时,有时会发现Session在一个文件中可以正常读取,但在另一个文件中却无法读取。这可能会让您感到困惑,因为会话数据应该可以在整个应用程序中共享。本文将解释如何在多个文件中正确地读取和写入PHP会话数据。

JavaScriptCookie使用JavaScriptcookie是记住和跟踪偏好、购买、佣金和其他信息的最有效方法。更好的访问者体验或网站统计所需的信息。PHPCookieCookie是存储在客户端计算机上的文本文件并保留它们用于跟踪目的。PHP透明地支持HTTPcookie。JavaScriptcookie如何工作?您的服务器将一些数据发送到访问者的浏览器cookie的形式。浏览器可以接受cookie。如果存在,它将作为纯文本记录存储在访问者的硬盘上。现在,当访问者到达站点上的另一个页面时

问题:今天项目中遇到了一个设置时间超时的问题,按SpringBoot2的application.properties更改一直不生效。解决方案:server.*属性用于控制SpringBoot使用的嵌入式容器。SpringBoot将使用ServletWebServerFactory实例之一创建servlet容器的实例。这些类使用server.*属性来配置受控的servlet容器(tomcat,jetty等)。当应用程序作为war文件部署到Tomcat实例时,server.*属性不适用。它们不适用,

近年来,微信小程序风靡全球,已经成为了许多企业和个人开发者的首选平台。在小程序的开发中,我们经常会遇到session问题,也就是如何在小程序中保存用户登录状态。这个问题对于网站开发者来说并不陌生,但在小程序中却有些不同。本文将介绍如何使用PHP解决微信小程序中的session问题。一、小程序登录过程概述小程序的登录流程与网站的登录流程类似,分为以下几个步骤:


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SublimeText3漢化版
中文版,非常好用

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器