在写后台程序时,有时候需要知道客户端发送的是普通的请求,还是ajax 请求,至少在我目前所做的项目中有这样一个用途:如果session 过期的时候,如果是普通请求,跳转到登录页面,但如果是ajax 请求,如果后台session 已经过期了,这时候会返回登陆界面的的html 代码作为ajax 的返回值,这样就很郁闷,不好处理,如果是ajax 请求,理想的方式是返回json给客户端,这样客户端就好处理. 目前我采用了比较笨的一个方法来实现,可以在 请求的参数中加入一个标志来判断.public class SessionIntecepter implements HandlerInterceptor {
private Logger logger = LoggerFactory.getLogger(SessionIntecepter.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws InvalidSessionException, InvalidSessionJsonException {
request.setAttribute("startTime", System.currentTimeMillis());
logger.info("current url: " + request.getRequestURI());
boolean result=false;
boolean ajax = "XMLHttpRequest".equals( request.getHeader("X-Requested-With") );
String ajaxFlag = null == request.getParameter("ajax") ? "false": request.getParameter("ajax") ;
boolean isAjax = ajax || ajaxFlag.equalsIgnoreCase("true");
HttpSession session = request.getSession();
result = null == session.getAttribute("user") ? false : true ;
if (!result){
if (isAjax){
throw new InvalidSessionJsonException("invalide session");
}else{
throw new InvalidSessionException("invalide session");
}
}
return result;
}
......
这里由于我是采用了spring mvc 的方式所以用了intecepter 方式来做,然后抛出异常,交给controller 去处理,controller 根据不同的异常,做不同的处理.
@ExceptionHandler(InvalidSessionException.class )
public ModelAndView sessionExceptionHandle(HttpServletRequest request, Exception ex) {
logger.error("500 Exception - " + ex.getMessage());
ModelAndView mv = new ModelAndView("error");
mv.addObject("message", "invalide session");
return mv;
}
/**
* return json format string for ajax request if error occurs.
* @param request
* @param ex
* @return
*/
@ExceptionHandler(InvalidSessionJsonException.class )
@ResponseBody
public JsonResult sessionJsonExceptionHandle(HttpServletRequest request, Exception ex) {
JsonResult jr =new JsonResult();
jr.setErrorCode(Constants.SESSION_TIMEOUT);
jr.setErrorMessage(ex.getMessage());
return jr;
}
这样就可以做到灵活应用了,另外一般来说,如果采用了 jquery 发送 ajax 请求,应该在http header 中,应该能有如下的语句成立: "XMLHttpRequest".equals( request.getHeader("X-Requested-With") );