springMVC session過期跳轉到登入介面
阿新 • • 發佈:2019-01-02
1、非ajax的傳統型跳轉和ajax請求資料跳轉
2、使用springMVC攔截器攔截請求,判斷session是否過期
3、使用ajaxSetup 全域性判斷session請求是否過期。
這種方式不是最好的方式,貌似有三種方式處理ajax重定向的問題,修改jquery原始碼、設定response頭、或者每次ajax增加判斷。我覺得修改jquery原始碼不好,每次判斷又要改大量的前端程式碼,累死-_-||!!,所有我覺得最小程度修改前端程式碼是最好的選擇。所以選擇了設定response頭。
部分攔截器程式碼:
實現HandlerInterceptor介面,重寫prehandle方法
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws SessionTimeoutException, IOException { String requestUrl = request.getRequestURI(); //獲取請求的URL for(String url : allowUrls) { //判斷請求URL是否屬於請求白名單 if(requestUrl.endsWith(url)||requestUrl.indexOf(url)>=0) { return true; } } String session = String.valueOf(WebUtils.getSessionAttribute(request, "userId")); String session1 = String.valueOf(WebUtils.getSessionAttribute(request, "zmccUser")); if("null".equals(session) || "null".equals(session1)) { //判斷session是否過期,如果是null則session過期 if(request.getHeader("x-requested-with")!=null){ // 非ajax請求比 ajax請求少一個x-requested-with屬性,所以有x-requested-with屬性則為ajax請求 response.setHeader("sessionstatus", "timeout"); //設定response頭,前臺依此來判斷是否session過期 return false; }else{ throw new SessionTimeoutException(); //非ajax請求,在我的專案中就是 返回ModelAndView,直接重定向就可以了,丟擲SessionTimeoutException自定義異常,注意這是我自己定義的異常 } } else { return true; } }
配置springMVC的XML
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**/*.do" /> <bean class="com.uniware.util.SessionTimeoutInterceptor" > <property name="allowUrls"> <list> <!-- 這些list是可以訪問的白名單,不需要驗證session --> <value>/login</value> <value>LoginController</value> </list> </property> </bean> </mvc:interceptor> </mvc:interceptors>
<!-- 處理自定義異常,直接跳轉,當然你也可以自己實現這個AbstractHandlerExceptionResolver -->
<bean id="handlerExceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver" >
<property name="exceptionMappings">
<props>
<prop key="com.uniware.util.SessionTimeoutException">redirect:/login.jsp</prop>
</props>
</property>
</bean>
/** * 設定未來(全域性)的AJAX請求預設選項
* 主要設定了AJAX請求遇到Session過期的情況
*/
$.ajaxSetup({
type: 'POST',
complete: function(xhr,status) {
var sessionStatus = xhr.getResponseHeader('sessionstatus');
if(sessionStatus == 'timeout') {
window.top.location.href = window.top.location;
}
}
});
最後你需要把上面的這段jquery程式碼放到每個請求前,我的專案有一個公共的工具js,我把這段貼在上面就可以了,這樣前端我就加了這一項,但是如果你的每個jsp引入的檔案都不一樣,沒有公共的js。那你就把他貼在jquery.js這種程式碼裡好了,當然最好別這樣做。
如果上面的程式碼或者思路有問題,請您指導。謝謝