问题分析:一开始,用拦截器做登录拦截,需求是博客系统,没有登录则没办法评论,但是可以进去观看博客。
测试:发现调试有响应,但是不跳转,查询发现是拦截器没有权限处理ajax
image.png
解决方案:手动指定判断是否为ajax,再做处理
后端拦截器核心代码:
image.png
public class LoginInterceptor implements HandlerInterceptor {
/**
* 在请求处理之前进行调用(Controller方法调用之前)
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
try {
//统一拦截(查询当前session是否存在user)(这里user会在每次登陆成功后,写入session)
User user = (User) request.getSession ( ).getAttribute ("user");
if (user != null && !"".equals (user)) {
return true;
}
//如果request.getHeader("X-Requested-With") 返回的是"XMLHttpRequest"说明就是ajax请求,需要特殊处理 否则直接重定向就可以了
if ("XMLHttpRequest".equals (request.getHeader ("X-Requested-With"))) {
//告诉ajax我是重定向
response.setHeader ("REDIRECT", "REDIRECT");
//告诉ajax我重定向的路径
response.setHeader ("CONTENTPATH", "/login");
response.setStatus (HttpServletResponse.SC_FORBIDDEN);
} else {
// 如果不是ajax请求,直接跳转
// response.sendRedirect(request.getContextPath()+"你的登陆页地址");
response.sendRedirect (request.getContextPath ( ) + "/login");
}
} catch (Exception e) {
e.printStackTrace ( );
}
return false;//如果设置为false时,被请求时,拦截器执行到此处将不会继续操作
//如果设置为true时,请求将会继续执行后面的操作
}
}
前端代码:
image.png
$.ajax({
url: 'saveComment',
data: {bid, testa},
type:'post',
jsonType:'json',
success: function (data) {
var result = data.result;
if (result == 'SUCCESS') {
alert('评论成功');
// 刷新
window.location.reload();
}
},
complete : function(xhr, status) {
//拦截器拦截没有权限跳转
// 通过xhr取得响应头
var REDIRECT = xhr.getResponseHeader("REDIRECT");
//如果响应头中包含 REDIRECT 则说明是拦截器返回的
if (REDIRECT == "REDIRECT")
{
document.location.href = xhr.getResponseHeader("CONTEXTPATH");
}
}
});