最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Javaweb項目session超時解決方案

 更新時間:2017年09月20日 14:56:06   作者:94小白菜  
這篇文章主要介紹了Javaweb項目session超時解決方案,關(guān)于解決方案分類比較明確,內(nèi)容詳細,需要的朋友可以參考下。

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

0.需求

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

1.引入

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

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

<span style="font-size: 14px;"> <!-- 設(shè)置Session超時時間 -->  
    <session-config> 
        <!-- 分鐘 --> 
            <session-timeout>60</session-timeout> 
            <!-- 去除URL上顯示的jsessionid, 防止打開Tab頁時出現(xiàn)JS錯誤 --> 
            <tracking-mode>COOKIE</tracking-mode> 
    </session-config></span><span style="font-size:24px;"> 
</span> 

2.請求的分類

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

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

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

3.后端處理Session超時

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

下面看一下攔截器的實現(xiàn):

/** 
* 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超時后,發(fā)起請求到此地址,只對普通請求有效
     */
    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請求, 前段根據(jù)此header進行處理
                        response.setHeader("sessionTimeout", "Session time out, you need relogin !");
                        // 返回未認證的狀態(tài)碼(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超時,則根據(jù)不同的請求方式進行返回。如果是普通請求,則直接返回JavaScript腳本,該腳本可以將頁面跳轉(zhuǎn)到其它URL。如果是Ajax請求,則返回401狀態(tài)碼,并且在返回的header中加入sessionTimeout,該數(shù)據(jù)將會在前端使用。

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

<span style="font-size:14px;"><!-- MVC攔截器 -->
<mvc:interceptors>
    <!-- Web登錄攔截器 -->
    <mvc:interceptor>
        <mvc:mapping path="/web/**"/>
        <mvc:exclude-mapping path="/web/index"/><!-- 防止循環(huán)重定向到首頁 -->
        <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腳本,會立刻執(zhí)行,這里前端不需要任何處理。

對于Ajax請求,后端返回401狀態(tài)碼,并在header中設(shè)置的sessionTimeout。這里使用jQuery的ajaxComplete回調(diào)函數(shù)處理,具體如下:

// 實現(xiàn)ajax請求時判斷Session是否失效 
$(document).ajaxComplete(function(event, response, settings) { 
 var sessionTimeout = response.getResponseHeader("SessionTimeout"); 
 if(sessionTimeout != null && typeof sessionTimeout != "undefined" && sessionTimeout.length > 0){ 
  // 這里寫Session超時后的處理方法 
 } 
}); 

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

總結(jié)

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

相關(guān)文章

  • 解決IDEA?JDK9沒有module-info.java的問題

    解決IDEA?JDK9沒有module-info.java的問題

    這篇文章主要介紹了解決IDEA?JDK9沒有module-info.java的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Java和Python現(xiàn)在都挺火,我應(yīng)該怎么選?

    Java和Python現(xiàn)在都挺火,我應(yīng)該怎么選?

    這篇文章主要介紹了Java和Python現(xiàn)在都挺火,我應(yīng)該怎么選?本文通過全面分析給大家做個參考,需要的朋友可以參考下
    2020-07-07
  • SpringMVC處理器映射器HandlerMapping詳解

    SpringMVC處理器映射器HandlerMapping詳解

    這篇文章主要介紹了SpringMVC處理器映射器HandlerMapping詳解,在SpringMVC中會有很多請求,每個請求都需要一個HandlerAdapter處理,具體接收到一個請求之后使用哪個HandlerAdapter進行處理呢,他們的過程是什么,需要的朋友可以參考下
    2023-09-09
  • IDEA加載項目沒有src目錄的問題及解決

    IDEA加載項目沒有src目錄的問題及解決

    這篇文章主要介紹了IDEA加載項目沒有src目錄的問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • java實現(xiàn)輕輕松松控制臺斗地主的示例代碼

    java實現(xiàn)輕輕松松控制臺斗地主的示例代碼

    這篇文章主要介紹了java實現(xiàn)輕輕松松控制臺斗地主,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 詳解如何在低版本的Spring中快速實現(xiàn)類似自動配置的功能

    詳解如何在低版本的Spring中快速實現(xiàn)類似自動配置的功能

    這篇文章主要介紹了詳解如何在低版本的Spring中快速實現(xiàn)類似自動配置的功能,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-05-05
  • SpringBoot集成Druid連接池進行SQL監(jiān)控的問題解析

    SpringBoot集成Druid連接池進行SQL監(jiān)控的問題解析

    這篇文章主要介紹了SpringBoot集成Druid連接池進行SQL監(jiān)控的問題解析,在SpringBoot工程中引入Druid連接池非常簡單,本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2021-07-07
  • Mybatis-plus的service通用接口解讀

    Mybatis-plus的service通用接口解讀

    這篇文章主要介紹了Mybatis-plus的service通用接口解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 如何從eureka獲取服務(wù)的ip和端口號進行Http的調(diào)用

    如何從eureka獲取服務(wù)的ip和端口號進行Http的調(diào)用

    這篇文章主要介紹了如何從eureka獲取服務(wù)的ip和端口號進行Http的調(diào)用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • spring?boot集成jasypt?并實現(xiàn)自定義加解密的詳細步驟

    spring?boot集成jasypt?并實現(xiàn)自定義加解密的詳細步驟

    由于項目中的配置文件?配置的地方過多,現(xiàn)將配置文件統(tǒng)一放到nacos上集中管理?且密碼使用加密的方式放在配置文件中,配置文件的加密使用加密庫jasypt,本文給大家介紹spring boot集成jasypt并實現(xiàn)自定義加解密,感興趣的朋友一起看看吧
    2023-08-08

最新評論

昭通市| 突泉县| 佛山市| 英超| 武鸣县| 武宁县| 浦城县| 连云港市| 阜康市| 廊坊市| 云浮市| 财经| 温州市| 永城市| 汕头市| 石屏县| 漾濞| 大洼县| 八宿县| 黔西县| 霸州市| 荃湾区| 肃宁县| 胶州市| 张家口市| 如东县| 新巴尔虎右旗| 惠州市| 常山县| 介休市| 宜君县| 天台县| 宣恩县| 宕昌县| 福海县| 贵定县| 阿巴嘎旗| 天峨县| 习水县| 察隅县| 崇礼县|