解决aAJAX请求过滤器重定向不跳转

解决ajax请求过滤器重定向不跳转

最近写的一个小商场项目,其中有一个过滤器(Filter),用于拦截请求,判断用户是否登录,如果未登录则跳转到登录页面,即在商品页面,点击加入购物车时,要先登录才行,但是加入购物车使用的是AJAX异步请求,而默认AJAX是不支持重定向的,因为AJAX本身就是局部刷新,不会重新加载页面的。所以需要在过滤器里再加个AJAX请求判断。

我们如果在调试中使用浏览器开发者工具的话,我们会发现在AJAX请求的目的Servlet中,请求头信息中有这么一条:X-Requested-With: XMLHttpRequest,这就表明这是一个AJAX请求,我们可以通过这一信息来辨别请求是来自一般的HTTP请求还是AJAX请求。

解决aAJAX请求过滤器重定向不跳转_第1张图片

如下是过滤器中部分代码:

常规情况,该过滤器用以判断用户是否登录,如果未登录,则跳转到登录页面,但是对于AJAX请求,则需要额外的判断。

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest req=(HttpServletRequest)request;
    HttpServletResponse resp=(HttpServletResponse)response;

    /*如果是AJAX请求,则值为XMLHttpRequest*/
    String type=req.getHeader("X-Requested-With")==null ? "" : req.getHeader("X-Requested-With");

    if(req.getSession().getAttribute("user") == null) {
        //未登录
        if("XMLHttpRequest".equals(type)) {
            //处理AJAX请求,设置响应头信息
            resp.setHeader("REDIRECT", "REDIRECT");
            /*需要跳转页面的URL*/
            resp.setHeader("CONTEXTPATH", req.getContextPath()+"/pages/account/login.jsp");
        }
        else {
            resp.sendRedirect(req.getContextPath()+"/pages/account/login.jsp");
        }
    }
    else {
        chain.doFilter(request, response);
    }
}

再在AJAX中对这回应信息进行判断,即当请求失败时,判断请求头中是否包含了我们设置的信息,如果是,则执行跳转

$.ajax({
    type:"post",
    url:"../../do/cartServlet?handler=add",
    async:true,
    data:{"productid" : productid,
          "num" : parseInt($("#num").val()),},
    dataType:"JSON",
    success:function(data, status, xhr){
        //alert("已经添加到购物车!");   
        alert(data);
        $("#quantity").text("("+data.count+")");
    },
   error:function(XMLHttpRequest, textStatus){
            var redirect=XMLHttpRequest.getResponseHeader("REDIRECT");
            if(redirect=="REDIRECT"){
                alert("请先登录!");
                window.location.href=XMLHttpRequest.getResponseHeader("CONTEXTPATH");
            }
        },
    complete:function(XMLHttpRequest, textStatus){
    }
});

你可能感兴趣的:(JavaScript,AJAX,重定向)