参考文章:http://blog.csdn.net/sunny__wei/article/details/78903735
1 后端处理
public class SessionInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest servletRequest, HttpServletResponse servletResponse, Object handler)
throws Exception {
String requestPath = WebUtils.getPathWithinApplication(WebUtils.toHttp(servletRequest));
System.out.println(requestPath);
if (requestPath.equals("/login")) {
return true;
}
if(session中含有user 信息)return true
reDirect(servletRequest, servletResponse);
return false;
// 判断用户是否是访问自己的数据,比如说查看自己的订单,但是有些url是不需要进行限制的
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}
// 对于请求是ajax请求重定向问题的处理方法
public void reDirect(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 获取当前请求的路径
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
+ request.getContextPath();
// 如果request.getHeader("X-Requested-With") 返回的是"XMLHttpRequest"说明就是ajax请求,需要特殊处理
if ("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))) {
// 告诉ajax我是重定向
response.setHeader("REDIRECT", "REDIRECT");
// 告诉ajax我重定向的路径
response.setHeader("CONTENTPATH", basePath + "/login");
response.setStatus(HttpServletResponse.SC_ACCEPTED);
} else {
response.sendRedirect(basePath + "/login");
}
}
}
几点注意:
(1),
String requestPath = WebUtils.getPathWithinApplication(WebUtils.toHttp(servletRequest)); 是转么用来获取请求路径的, 比如说说你的请求url为http://locahost:8081/WebName/account/address/add
那么获取到的路径就是/account/address/add 也就是除了web应用名称之后的那部分
因此我们可以使用这个来判断是否是登陆请求的路径
(2) 在做重定向的时候 判断是否是ajax请求,如果是ajax请求那么就在请求头中添加 标示信息,
这个标示信息 意思是告诉前端这个是一个ajax重定向 的操作,另外需要添加一个请求头参数 是重定向请求的路径。
特别注意 response.setStatus(HttpServletResponse.SC_ACCEPTED); 这里的是指设置ajax请求的返回状态码为200, 这个状态码不可以是302,不可以是403 404等其他状态码.
2前端设置
//设置ajax请求完成后运行的函数,
$.ajaxSetup({
complete:function(){
if("REDIRECT" == jqxhr.getResponseHeader("REDIRECT")){ //若HEADER中含有REDIRECT说明后端想重定向,
var win = window;
while(win != win.top){
win = win.top;
}
win.location.href = jqxhr.getResponseHeader("CONTENTPATH");//将后端重定向的地址取出来,使用win.location.href去实现重定向的要求
}
}
});
var jqxhr;
jqxhr= $.ajax({
type: "post",
dataType: "json",
url: "/account/address/ajax",
success: function (data) {
var data = eval("(" + data + ")");
if (data.status == 200) {
$("#" + panelId).remove();
}else{
alert(data.msg);
}
console.log(data);
}
});
意思是将当前ajax请求保存起来,然后根据请求返回的请求头中的数据判断是否需要进行重定向操作。
网友评论