简单拦截器代码:
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object arg2) throws Exception {
//获取用户请求url
if(request.getRequestURI().endsWith("/login")){
return true;
}else{
if(request.getSession().getAttribute("username")==null){
response.sendRedirect(request.getRequestURL().substring(0, request.getRequestURL().indexOf(request.getContextPath()))+request.getContextPath());
return false;
}else{
return true;
}
}
}
用户登录进去后,服务突然断掉。之后启动服务,用户点击操作按钮,断点调试可以走到response.sendRedirect(...)这里,但是重定向后,页面并没有进行调整到登录页面。
问题已经解决了。倒腾一下午
如果服务中途停止,用户访问非ajax请求的地址,是可以跳转到登录界面的。但是ajax请求地址,就会无法调整,导致页面不动。解决办法就是稍微改动一下拦截器,代码如下:
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object arg2) throws Exception {
//获取用户请求url
if(request.getRequestURI().endsWith("/login")){
return true;
}else{
if(request.getSession().getAttribute("username")==null){
if("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))){//判断是否为ajax请求
PrintWriter out = response.getWriter();//如果是ajax请求,返回一个标识,告诉ajax请求无效,需要重新登录
out.print("login");
return false;
}
response.sendRedirect(request.getRequestURL().substring(0, request.getRequestURL().indexOf(request.getContextPath()))+request.getContextPath());
return false;
}else{
return true;
}
}
}
前天jsp页面,需要这样处理:
$.ajax({
type: "POST",
url: .后台地址,
success: function(msg){
if("login"==msg){
window.location.href="${ctx}/";
};
//.....
});
同时为了防止登录页面无法显示全屏,需要在登录jsp页面加如下代码:
//防止iframe嵌套
if(top.location != self.location){
top.location=self.location;
};
现在问题已经解决了。
调试可以走到response.sendRedirect(...)这里,但是重定向后,页面并没有进行调整到登录页面,我之前也遇到过,我上次是因为表单 属性填写有问题