需求是:登陆过期跳转到登录首页
最开始,我想到的是springMVC的拦截器类,继承 HandlerInterceptorAdapter类,然后重写下面的几个方法
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true;
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
}
或则实现HandlerInterceptor接口重写下面三个方法
boolean preHandle(HttpServletRequest var1, HttpServletResponse var2, Object var3) throws Exception;
void postHandle(HttpServletRequest var1, HttpServletResponse var2, Object var3, ModelAndView var4) throws Exception;
void afterCompletion(HttpServletRequest var1, HttpServletResponse var2, Object var3, Exception var4) throws Exception;
然后在自定义拦截器类中的preHandle方法中,写拦截逻辑。
public class LoginInterceptor extends HandlerInterceptorAdapter{
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if(登录用户为null){
// 重定向到另一个页面
response.sendRedirect("http://www.baidu.com");
// 停止请求继续执行
return false;
} else {
...
}
// 请求继续向下执行
return true;
}
....
}
最后再spring-mvc.xml中配置
<mvc:interceptors>
<!-- 对未登录用户的操作进行拦截 -->
<mvc:interceptor>
<!-- 对登录操作进行拦截 -->
<mvc:mapping path="/**"/>
<bean class="com.mf.ssm.core.aj.util.LoginInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
这里,我发现一个问题,一次有多个请求过来时,重定向会报错。通常,一个html页面中,会调用多个ajax方法,可能是表格赋值,也可能是下拉选赋值…
- 所以能不能使用拦截器拦截html页面呢?这样我们只处理一个请求,就不会发生连续重定向错误了。 目前没找到这种的解决方法。
最后,我花了太多时间,也避免了连续重定向,虽然响应状态码是200(说明是成功的),但是页面还是无法重定向到指定的页面。最后,在网上找到了问题所在:ajax的请求,是不能在后端再次重定向的,卧槽,无情。后来发现了解决方法:ajax请求重定向
但是,我不想这么做(因为,我以经浪费了大量时间)。这样每个ajax返回数据成功后,都要去判断后端是否需要重定向,如果需要,则还要去取出重定向地址,然后使用window.location.href跳转重定向的地址。
最后,想到一种相对简单的方法:
我可以在页面执行前判断cooke有没有值,进而确定有无登录用户。
// 返回检查cookies中有没有用户,没有就重定向到登录页面
function getCookie(NameOfCookie) {
if (document.cookie.length > 0) {
begin = document.cookie.indexOf(NameOfCookie + "=");
if (begin !== -1) {
begin += NameOfCookie.length + 1;
end = document.cookie.indexOf(";", begin);
if (end === -1) end = document.cookie.length;
return unescape(document.cookie.substring(begin, end));
}
}
return null;
}
console.log(getCookie('_sessionYongChuanId'))
// cookie的名称
if(getCookie('_sessionYongChuanId')==null){
// 跳转到登录页面
window.location.href="http://192.168.1.185:8083"
}
新建一个js文件,将上面代码赋值进去,修改_sessionYongChuanId,为自己的cookie 名字,然后其它页面都引用这个js即可解决问题。