解决ajax请求过滤器重定向不跳转
最近写的一个小商场项目,其中有一个过滤器(Filter),用于拦截请求,判断用户是否登录,如果未登录则跳转到登录页面,即在商品页面,点击加入购物车时,要先登录才行,但是加入购物车使用的是AJAX异步请求,而默认AJAX是不支持重定向的,因为AJAX本身就是局部刷新,不会重新加载页面的。所以需要在过滤器里再加个AJAX请求判断。
我们如果在调试中使用浏览器开发者工具的话,我们会发现在AJAX请求的目的Servlet中,请求头信息中有这么一条:X-Requested-With: XMLHttpRequest,这就表明这是一个AJAX请求,我们可以通过这一信息来辨别请求是来自一般的HTTP请求还是AJAX请求。
如下是过滤器中部分代码:
常规情况,该过滤器用以判断用户是否登录,如果未登录,则跳转到登录页面,但是对于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){
}
});