Heim  >  Artikel  >  Java  >  Lösung des Problems der Sitzungszeitüberschreitung im Javaweb-Projekt

Lösung des Problems der Sitzungszeitüberschreitung im Javaweb-Projekt

黄舟
黄舟Original
2017-09-21 10:16:042344Durchsuche

In diesem Artikel wird hauptsächlich die Sitzungs-Timeout-Lösung für Javaweb-Projekte vorgestellt. Die Klassifizierung der Lösung ist relativ klar und der Inhalt ist detailliert.

In der Java-Webentwicklung bietet uns Session viel Komfort. Die Sitzung wird zwischen dem Browser und dem Server verwaltet. Unter Sitzungszeitüberschreitung versteht man: Es wird eine Sitzung zwischen dem Browser und dem Server erstellt. Da der Client längere Zeit nicht mit dem Server interagiert, zerstört der Server diese Sitzung, wenn der Client erneut mit dem Server interagiert. Die vorherige Sitzung existiert nicht.

0. Anforderungen

Alle /web/**-Anfragen müssen angemeldet und abgefangen werden, und die Anmeldeseite springt zur Sitzung, wenn die Sitzungszeitüberschreitung.

1. Einführung

Im Allgemeinen wird das Sitzungszeitlimit während der Projektnutzung konfiguriert. Wenn es nicht konfiguriert ist, beträgt der Standardwert 30 Minuten Das heißt, nachdem der Benutzer 30 Minuten lang nicht gearbeitet hat, läuft die Sitzung ab und der Benutzer muss sich erneut beim System anmelden.

Die Konfiguration des Sitzungszeitlimits wird in der web.xml des Hauptprojekts wie folgt konfiguriert:


<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. Klassifizierung von Anfragen

Anfragen in aktuellen Projekten werden hauptsächlich in zwei Typen unterteilt: Eine ist eine normale Anfrage, die eine Anfrage initiiert und eine Ansicht und ein Modell zurückgibt, die andere ist eine Ajax-Anfrage. die hauptsächlich Modelldaten zurückgibt. Wenn das Backend eine Verarbeitung durchführt, muss es je nach Anforderung unterschiedliche Inhalte zurückgeben.

Für normale Anfragen geben wir das JavaScript-Skript direkt zurück. Der Inhalt des Skripts kann darin bestehen, zur Anmeldeseite zu springen.

Für Ajax-Anfragen muss ein anderer Statuscode als 200 zurückgegeben werden, damit die Ajax-Anfrage in die Fehlerrückruffunktion und die globale Ajax-Fehlerrückruffunktion AjaxError eingeht.

3. Backend-Verarbeitung Sitzungszeitlimit

Das Backend verwendet die Interceptor-Verarbeitung von SpringMVC. Warum wird hier ein Interceptor verwendet? Einerseits darf die Anforderungs-URL nicht zu restriktiv sein, z. B. /*. Es ist eine Verschwendung von Ressourcen, alle Anforderungen zu filtern. Andererseits müssen einige URLs nicht abgefangen werden. Beispielsweise dürfen Anfragen an die Anmeldeseite nicht abgefangen werden, da sie sonst in einer Schleife umgeleitet werden. Andererseits müssen wir nur Controller-Anfragen abfangen und keine anderen Anfragen.

Werfen wir einen Blick auf die Implementierung des Interceptors:


/** 
* 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
}

Beurteilen Sie, ob die Sitzung abgelaufen ist, indem Sie die Existenz von ermitteln Das Benutzerobjekt in der Sitzung. Wenn die Sitzung abläuft, wird sie gemäß verschiedenen Anforderungsmethoden zurückgegeben. Wenn es sich um eine normale Anfrage handelt, wird das JavaScript-Skript direkt zurückgegeben, wodurch die Seite zu anderen URLs weitergeleitet werden kann. Wenn es sich um eine Ajax-Anfrage handelt, wird ein 401-Statuscode zurückgegeben und sessionTimeout zum zurückgegebenen Header hinzugefügt. Diese Daten werden im Frontend verwendet.

Der Interceptor ist in der SpringMVC-Konfigurationsdatei wie folgt konfiguriert:


<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. Front-End-Verarbeitung Sitzungszeitlimit

Bei gewöhnlichen Anfragen gibt das Backend ein JavaScript-Skript zurück, das sofort ausgeführt wird. Das Frontend benötigt hier keine Verarbeitung.

Bei Ajax-Anfragen gibt das Backend einen 401-Statuscode und den im Header festgelegten sessionTimeout zurück. Die ajaxComplete-Rückruffunktion von jQuery wird hier wie folgt verwendet:


// 实现ajax请求时判断Session是否失效 
$(document).ajaxComplete(function(event, response, settings) { 
 var sessionTimeout = response.getResponseHeader("SessionTimeout"); 
 if(sessionTimeout != null && typeof sessionTimeout != "undefined" && sessionTimeout.length > 0){ 
  // 这里写Session超时后的处理方法 
 } 
});

Okay, das ist es. Benutzer, deren Sitzungszeitüberschreitung auftritt, werden verarbeitet.

Zusammenfassung

Das obige ist der detaillierte Inhalt vonLösung des Problems der Sitzungszeitüberschreitung im Javaweb-Projekt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn