判断Httprequest 是否ajax 请求的方法

摘要: 在写后台程序时,有时候需要知道客户端发送的是普通的请求,还是ajax 请求,至少在我目前所做的项目中有这样一个用途:如果session  过期的时候,如果是普通请求,跳转到登录页面,但如果是ajax 请求,如果后台session 已经过期了,这时候会返回登陆界面的的html 代码作为ajax 的返回值,这样就很郁闷,不好处理,如果是ajax 请求,理想的方式是返回json给客户端,这样客户端就好处理. 目前我采用了比较笨的一个方法来实现,可以在 请求的参数中加入一个标志来判断.

在写后台程序时,有时候需要知道客户端发送的是普通的请求,还是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") );

上一篇: Django request 获取全路径的方法
下一篇: 利用DWR实现网页推送,逆向AJAX的例子, 附源码

Avatar

jxausea 评论于: 2014-11-27

客服端还要穿一个ajax标志?
[reply=yihaomen,2014-11-28 12:36 AM]为了保险传一个,通常情况通过http header 就能判断到。[/reply]
 评论 ( What Do You Think )
名称
邮箱
网址
评论
验证
   
 

 


  • 微信公众号

  • 我的微信

站点声明:

1、一号门博客CMS,由Python, MySQL, Nginx, Wsgi 强力驱动

2、部分文章或者资源来源于互联网, 有时候很难判断是否侵权, 若有侵权, 请联系邮箱:summer@yihaomen.com, 同时欢迎大家注册用户,主动发布无版权争议的 文章/资源.

3、鄂ICP备14001754号-3, 鄂公网安备 42280202422812号