判断Httprequest 是否ajax 请求的方法

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



除非申明,文章均为一号门原创,转载请注明本文地址,谢谢!
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: httprequest ajax
相关日志:
评论: 1 | 引用: 0 | 查看次数: -
回复回复jxausea[2014-11-27 05:15 PM | del]
客服端还要穿一个ajax标志?
回复来自 yihaomen 的评论 yihaomen 于 2014-11-28 12:36 AM 回复
为了保险传一个,通常情况通过http header 就能判断到。
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.