在项目中,考虑到web前台ajax请求未登录资源时,后台返回的重定向信息,ajax不能自动判断是否是重定向,以下是一种折中方法,如各位有什么更好的方法,还请告诉我一声,哈哈
下面进入正题.............
LoginInterceptor.java:
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import com.yasinyt.loan.admin.entity.User;
import com.yasinyt.loan.admin.util.IPUtils;
/**
* 登陆拦截器
* @projectName loan-admin
* @packageName com.yasinyt.loan.admin.interceptor
* @author E-mail: liuzongyang@yasinyt.com
* @date 2017年10月7日 上午9:15:35
* @version 1.0
* @description 如果用户未登录,或者登陆超时,访问需要登录访问的资源时则会重定向到登陆页面
*/
public class LoginInterceptor extends HandlerInterceptorAdapter {
private static Logger log = LoggerFactory.getLogger(LoginInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// 获得请求路径的uri
String uri = request.getRequestURI();
HttpSession session = request.getSession();
// 进入登录页面,判断session中是否有key,有的话重定向到首页,否则进入登录界面
User user = (User) session.getAttribute(session.getId());
if (uri.contains("login") || uri.contains("getYzm")) {
return true;
}else {
String ipv4 = IPUtils.getRequestIp(request);
if ( user == null) {
StringBuilder sb = new StringBuilder();
String port = "",contextPath="";
if(request.getServerPort()!=80){
port = ":" + request.getServerPort();
}
if(StringUtils.isNoneBlank(request.getContextPath().replace("/", ""))){
contextPath = request.getContextPath();
}
sb.append(request.getScheme()).append("://").append(request.getServerName()).append(port).append(contextPath).append("/login");
String loginPath = sb.toString();
log.warn("发起请求IP未登录:IP:{}", ipv4);
//判断如果是ajax,则需要设置response参数,告诉ajax这是重定向
//这里设置完之后,需要到common.js中设置jquery-ajax默认设置,详细查看$.ajaxSetup方法
String type = request.getHeader("X-Requested-With")==null?"":request.getHeader("X-Requested-With");
if ("XMLHttpRequest".equals(type)) {
response.setHeader("REDIRECT", "REDIRECT");//告诉ajax这是重定向
response.setHeader("CONTEXTPATH", loginPath);//重定向地址
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
return false;
}else{//如果不是ajax请求,则直接重定向
response.sendRedirect(loginPath);
return false;
}
} else{
log.info("发起请求IP:{},sessionId:{},用户名:{},姓名:{}",
ipv4,
session.getId(),
user.getUserName(),
user.getRealName()
);
return true;
}
}
}
}
/**
* ajax默认设置
* 包括默认提交方式为POST,
* 判断后台是否是重定向
*/
$.ajaxSetup( {
//设置ajax请求结束后的执行动作
complete : function(XMLHttpRequest, textStatus) {
// 通过XMLHttpRequest取得响应头,REDIRECT
var redirect = XMLHttpRequest.getResponseHeader("REDIRECT");//若HEADER中含有REDIRECT说明后端想重定向
if (redirect == "REDIRECT") {
var win = window;
while (win != win.top){
win = win.top;
}
//将后端重定向的地址取出来,使用win.location.href去实现重定向的要求
layerAlert(layer,"您的登录信息已超时,请重新登录<p class='ps'>ps:在客户端闲置10分钟后系统会自动登出</p>",'登录超时提示',5,'',0,function(){
win.location.href= XMLHttpRequest.getResponseHeader("CONTEXTPATH");
})
}
},
type:'POST'
});