소개
최근 프로젝트를 진행하면서 Ajax 요청을 서버의 로그인 페이지로 직접 리디렉션할 수 없다는 사실을 발견했습니다. 일부 정보를 확인한 후 누군가 jquery의 ajax 요청에 대한 메소드를 제공한 것을 발견했습니다. 그러나 webix의 ajax 요청과 jquery의 요청에는 몇 가지 차이점이 있습니다. 이는 webix의 ajax 요청 세션 시간 초과 점프를 구현하기 위해 jquery의 처리 방법을 모방합니다.
특정 접근 방식:
1. webix.js 소스 코드를 확인하고 webix.ajax에는 반환 상태를 가져오려면 사전 요청 수신 기능인 "onBeforeAjax"만 있는지 확인하세요. 로그인 페이지에서는 반환된 청취 기능이 있어야 하지만 소스 코드는 그렇지 않습니다. 그래서 소스 코드를 수정하고 반환된 청취 함수 "onAfterAjax"를 추가했습니다.
빨간색으로 표시된 부분이 제가 추가한 코드입니다. ajax가 완료되었음을 감지하면 "onAfterAjax"가 자동으로 실행됩니다. (코드 위치는 webix.js에서 검색 가능하며, 조건은 "onBeforeAjax"이고, 해당 위치에 빨간색 코드를 추가하면 됩니다
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. webix.ajx 요청에는 아무 것도 없습니다. 명백한 표시이고 jquery.ajax의 로고는 x-requested-with이므로 requestFlag="webix" 플래그 제공을 시뮬레이션하고(기본 설정을 지정할 수 있음) "onBeforeAjax"
webix.attachEvent("onBeforeAjax",function(s, t, e, a, o){o["requestFlag"]="webix"})로 설정했습니다.
3. 반품 현황 모니터링
webix.attachEvent("onAfterAjax",function(xhr){if(xhr.getResponseHeader("sessionstatus")=='timeout'){window.location.href='/webix/login.html'}});
4. >4.1 인터셉터 코드
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 스프링 구성 파일에 인터셉터 구성 추가
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/mvc/*" /> <bean class="com.ljx.filter.UserInterceptor"></bean> </mvc:interceptor> </mvc:interceptors>
4.3 F12 콘솔에서 실행 webix.ajax 보기 효과
webix.ajax().get("/webix/mvc/login.action")
위는 에서 소개한 webix+springmvc 세션 시간 초과 점프 로그인 페이지입니다. 편집자 여러분께 도움이 되길 바랍니다. 질문이 있으시면 메시지를 남겨주세요.
webix+springmvc 세션과 관련된 더 많은 기사를 확인해보세요. 시간 초과 로그인 페이지, PHP 중국어 웹사이트를 주목하세요! 🎜>