Maison  >  Article  >  interface Web  >  Le délai d'expiration de la session Webix Springmvc passe à la page de connexion

Le délai d'expiration de la session Webix Springmvc passe à la page de connexion

高洛峰
高洛峰original
2017-01-07 09:32:141475parcourir

Introduction

En travaillant récemment sur un projet, j'ai découvert que les requêtes ajax ne pouvaient pas être redirigées directement vers la page de connexion du serveur. Après avoir vérifié certaines informations, j'ai découvert que quelqu'un avait donné une méthode pour la requête ajax de jquery. Mais il existe quelques différences entre la requête ajax de webix et celle de jquery. Cela imite la méthode de traitement de jquery pour implémenter le saut de délai d'expiration de la session de requête ajax de webix.

Approche spécifique :

1. Vérifiez le code source de webix.js et constatez que webix.ajax n'a que la fonction d'écoute de pré-requête "onBeforeAjax". sur la page de connexion, vous devez avoir une fonction d'écoute renvoyée, mais pas le code source. J'ai donc modifié le code source et ajouté une fonction d'écoute renvoyée "onAfterAjax".

La partie marquée en rouge est le code que j'ai ajouté. Lorsqu'il détecte que l'ajax est terminé, "onAfterAjax" est automatiquement exécuté. (L'emplacement du code peut être recherché pour webix.js, la condition est "onBeforeAjax", puis ajoutez simplement le code rouge à l'emplacement correspondant

if (webix.callEvent("onBeforeAjax", [s, t, e, a, o, null, r])) {
var h = !1;
if ("GET" !== s) {
var l = !1;
for (var c in o)"content-type" == c.toString().toLowerCase() && (l = !0, "application/json" == o[c] && (h = !0));
l || (o["Content-Type"] = "application/x-www-form-urlencoded")
}
if ("object" == typeof e)if (h)e = this.stringify(e); else {
var u = [];
for (var d in e) {
var f = e[d];
(null === f || f === webix.undefined) && (f = ""), "object" == typeof f && (f = this.stringify(f)), u.push(d + "=" + encodeURIComponent(f))
}
e = u.join("&")
}
e && "GET" === s && (t = t + (-1 != t.indexOf("?") ? "&" : "?") + e,
e = null), a.open(s, t, !this.H);
var b = this.Tw;
b && (a.responseType = b);
for (var c in o)a.setRequestHeader(c, o[c]);
var x = this;
return this.master = this.master || n, a.onreadystatechange = function () {
if (!a.readyState || 4 == a.readyState) {
if (webix.callEvent("onAfterAjax", [a]) === !1) {
return false;
};
if (webix.ajax.count++, i && x && !a.aborted) {
if (-1 != webix.ly.find(a))return webix.ly.remove(a);
var t, e, s = x.master || x, r = a.status >= 400 || 0 === a.status;
"blob" == a.responseType || "arraybuffer" == a.responseType ? (t = "", e = a.response) : (t = a.responseText || "", e = x.J(a)), webix.ajax.$callback(s, i, t, e, a, r)
}
x && (x.master = null), i = x = n = null
}
}, this.qh && (a.timeout = this.qh), this.H ? a.send(e || null) : setTimeout(function () {
a.aborted || (-1 != webix.ly.find(a) ? webix.ly.remove(a) : a.send(e || null));
}, 1), this.master && this.master.Ve && this.master.Ve.push(a), this.H ? a : r
}

2. La requête webix.ajx n'a pas signe évident, et le logo de jquery.ajax est x-requested-with, j'ai donc simulé en donnant un indicateur requestFlag="webix" (vous pouvez définir vos propres préférences), et j'ai utilisé "onBeforeAjax" pour définir

webix.attachEvent("onBeforeAjax",function(s, t, e, a, o){o["requestFlag"]="webix"})

3. Surveillance de l'état de retour

webix.attachEvent("onAfterAjax",function(xhr){if(xhr.getResponseHeader("sessionstatus")=='timeout'){window.location.href='/webix/login.html'}});

4. >4.1 Code de l'intercepteur

package com.ljx.filter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class UserInterceptor implements HandlerInterceptor {
@Override
public void afterCompletion(HttpServletRequest arg0,
HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
}
@Override
public void postHandle(HttpServletRequest arg0,
HttpServletResponse response, Object arg2, ModelAndView arg3)
throws Exception {
response.sendRedirect("/webix/login.html");
}
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
Object obj = request.getSession().getAttribute("LOGIN");
if (null == obj) { // 未登录
if (request.getHeader("requestFlag") != null
&& request.getHeader("requestFlag").equalsIgnoreCase(
"webix")) { // 如果是ajax请求响应头会有,requestFlag
response.setHeader("sessionstatus", "timeout");// 在响应头设置session状态
} else {
response.sendRedirect(request.getContextPath() + "/login");
}
return false;
}
return true;
}
}

4.2 Ajouter la configuration de l'intercepteur au fichier de configuration du ressort

<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/mvc/*" />
<bean class="com.ljx.filter.UserInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>

4.3 Exécuter sous la console F12 effet de vue webix.ajax

webix.ajax().get("/webix/mvc/login.action")

Ce qui précède est la page de connexion par saut de délai d'expiration de la session webix springmvc introduite par l'éditeur . J'espère que cela sera utile à tout le monde. Aide, si vous avez des questions, laissez-moi un message, l'éditeur vous répondra à temps

Pour plus d'articles liés à la page de connexion du délai d'expiration de la session webix springmvc, veuillez faire attention au site Web PHP chinois

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn