spring-mvc ajax访问 session超时 添加拦截

学识尚浅,若有需更正地方,请见谅并留言,谢谢!


我们先了解一下一些必要的信息。ajax 请求和普通的 http 请求是不一样的,Ajax请求是XMLHTTPRequest对象发起的,而http请求是浏览器发起的。

二者不同地方体现在HTTP请求的头信息中。

AJAX请求头中带有X-Requested-With信息,其值为XMLHttpRequest。而普通请求是没有的。


spring-mvc.xml 配置文件设置

<!-- 配置拦截器,拦截请求(除了登录ajax请求外拦截全部ajax请求) -->
    <mvc:interceptors >
	    <mvc:interceptor>
	    	<mvc:mapping path="/**"/>
    		<mvc:exclude-mapping path="/admin/login/**"/>	
    		<bean class="com.wxc.paycoss.filter.AjaxCheckSession"/>
    	</mvc:interceptor>
    </mvc:interceptors></span>

说明:其中<bean> 中的 class 是对应包下的拦截器路径


下面是拦截器  AjaxCheckSession.java  (这个类自由命名)


package com.wxc.paycoss.filter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import org.springframework.web.util.UrlPathHelper;

import com.cvicse.paycoss.base.Const;
import com.cvicse.paycoss.domain.Oper;


public class AjaxCheckSession  extends HandlerInterceptorAdapter{
	private final Logger logger = LoggerFactory.getLogger(PaycossContextListener.class);
	 // URL辅助工具类
    private UrlPathHelper urlPathHelper = new UrlPathHelper();

	@Override
	public void afterCompletion(HttpServletRequest request,
			HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		// TODO Auto-generated method stub
		super.afterCompletion(request, response, handler, ex);
	}

	@Override
	public void afterConcurrentHandlingStarted(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws Exception {
		// TODO Auto-generated method stub
		super.afterConcurrentHandlingStarted(request, response, handler);
	}

	@Override
	public void postHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		// TODO Auto-generated method stub
		super.postHandle(request, response, handler, modelAndView);
	}

	@Override
	public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws Exception {
		
		
		Oper oper = (Oper) request.getSession().getAttribute(Const.SESSION_LOGIN_ADMIN_USER);
		
		String requestCTX = urlPathHelper.getContextPath(request);
		System.out.println(requestCTX);
	 	String requestUri = request.getRequestURI(); //请求完整路径,可用于登陆后跳转
	 	String contextPath = request.getContextPath();  //项目下完整路径
	 	String url = requestUri.substring(contextPath.length()); //请求页面
	 	logger.debug("======拦截器配置成功======");
	 	logger.debug("======拦截来自:"+requestUri+"的请求=======");
	 	logger.debug("======拦截的页面路径是:==:"+url+"=======");
	 	//throw new Exception("登录超时!");
	 	
 		if(oper == null){//如果获取不到登录的session
 			//如果是ajax请求
 			if (request.getHeader("x-requested-with") != null 
 					&& request.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")){ 
 				response.setHeader("sessionstatus", "timeout"); // 响应头设置session状态 
 				return false;  //session超时,ajax访问返回false
 			}
 		}
		
		return super.preHandle(request, response, handler);
	}
	
}
以上代码有一些log打印根据自己需要,可以只选其中必须的代码


有了配置文件,也有了拦截器,在拦截器中已经设置了返回的信息,而这些信息会被 javascript 获取到。

$.ajaxSetup方法是来设置AJAX请求默认选项的,我们可以认为是全局的选项设置,因此可以将这段代码提到外部JS文件中,在需要的页面引用。


/**
 * 设置未来(全局)的AJAX请求默认选项
 * 主要设置了AJAX请求遇到Session过期的情况
 */

$.ajaxSetup({
  type: 'POST',
  contentType:"application/x-www-form-urlencoded;charset=utf-8",
  complete: function(xhr,status) {
    var sessionStatus = xhr.getResponseHeader('sessionstatus');
    if(sessionStatus == 'timeout') {
      //var top = getTopWinow();
      //var yes = confirm('由于您长时间没有操作, session已过期, 请重新登录.');
      //if (yes) {
    	alert("登录超时,请重新登录!");
    	window.location.href = '/admin/login/out.do';
      //}
    }
  }
});

/**
* 在页面中任何嵌套层次的窗口中获取顶层窗口
* @return 当前页面的顶层窗口对象
*/

function getTopWinow(){
  var p = window;
  while(p != p.parent){
    p = p.parent;
  }
  return p;
}


在这里不得不说一下 ajaxSetup 中的 contentType ,若不设置,有可能弹出的信息是中文,但是往往会出现编码乱码。



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值