判断Httprequest 是否ajax 请求的方法
By:Roy.LiuLast updated:2014-11-27
在写后台程序时,有时候需要知道客户端发送的是普通的请求,还是ajax 请求,至少在我目前所做的项目中有这样一个用途:如果session 过期的时候,如果是普通请求,跳转到登录页面,但如果是ajax 请求,如果后台session 已经过期了,这时候会返回登陆界面的的html 代码作为ajax 的返回值,这样就很郁闷,不好处理,如果是ajax 请求,理想的方式是返回json给客户端,这样客户端就好处理. 目前我采用了比较笨的一个方法来实现,可以在 请求的参数中加入一个标志来判断.
这里由于我是采用了spring mvc 的方式所以用了intecepter 方式来做,然后抛出异常,交给controller 去处理,controller 根据不同的异常,做不同的处理.
这样就可以做到灵活应用了,另外一般来说,如果采用了 jquery 发送 ajax 请求,应该在http header 中,应该能有如下的语句成立: "XMLHttpRequest".equals( request.getHeader("X-Requested-With") );
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") );
From:一号门
Previous:Django request 获取全路径的方法
COMMENTS