Einführung
Bei der Arbeit an einem Projekt habe ich kürzlich festgestellt, dass Ajax-Anfragen nicht direkt zur Anmeldeseite auf dem Server umgeleitet werden können. Nachdem ich einige Informationen überprüft hatte, stellte ich fest, dass jemand eine Methode für die Ajax-Anfrage von jquery angegeben hatte. Es gibt jedoch einige Unterschiede zwischen der Ajax-Anfrage von Webix und der von JQuery. Dies imitiert die Verarbeitungsmethode von jquery, um den Timeout-Sprung für Ajax-Anforderungssitzungen von Webix zu implementieren.
Spezifischer Ansatz:
1. Überprüfen Sie den Quellcode von webix.js und stellen Sie fest, dass webix.ajax nur über die Pre-Request-Listening-Funktion „onBeforeAjax“ verfügt Auf der Anmeldeseite müssen Sie über eine zurückgegebene Listening-Funktion verfügen, der Quellcode jedoch nicht. Also habe ich den Quellcode geändert und eine zurückgegebene Listening-Funktion „onAfterAjax“ hinzugefügt.
Der rot markierte Teil ist der Code, den ich hinzugefügt habe. Wenn erkannt wird, dass Ajax abgeschlossen ist, wird „onAfterAjax“ automatisch ausgeführt. (Der Speicherort des Codes kann nach webix.js durchsucht werden, die Bedingung ist „onBeforeAjax“, und dann fügen Sie einfach den roten Code an der entsprechenden Stelle hinzu
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. Die webix.ajx-Anfrage hat keine offensichtliches Zeichen, und das Logo von jquery.ajax ist x-requested-with, also habe ich simuliert, ein Flag requestFlag="webix" zu geben (Sie können Ihre eigene Präferenz festlegen) und es mit „onBeforeAjax“
webix.attachEvent("onBeforeAjax",function(s, t, e, a, o){o["requestFlag"]="webix"})
3. Überwachung des Rückgabestatus
webix.attachEvent("onAfterAjax",function(xhr){if(xhr.getResponseHeader("sessionstatus")=='timeout'){window.location.href='/webix/login.html'}});
4 >4.1 Interceptor-Code
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 Interceptor-Konfiguration zur Federkonfigurationsdatei hinzufügen
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/mvc/*" /> <bean class="com.ljx.filter.UserInterceptor"></bean> </mvc:interceptor> </mvc:interceptors>
4.3 Ausführung unter F12-Konsole webix.ajax-Ansichtseffekt
webix.ajax().get("/webix/mvc/login.action")
Das Obige ist die Webix + SpringMVC-Sitzungs-Timeout-Sprung-Anmeldeseite, die von eingeführt wurde Herausgeber. Ich hoffe, dass es für alle hilfreich ist. Wenn Sie Fragen haben, wird der Herausgeber Ihnen rechtzeitig antworten Timeout-Anmeldeseite, achten Sie bitte auf die chinesische PHP-Website 🎜>