首先,实现拦截器的操作很简单,只要按部就班即可 :
public class LoginInterceptor extends HandlerInterceptorAdapter{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Object user = request.getSession().getAttribute("login");
String k = request.getServletPath();
if (!k.equals("/admin/login.do")) {
String type = request.getHeader("X-Requested-With");// XMLHttpRequest
if (user == null) {
// 重定向
String path = request.getContextPath();
String basePath = request.getScheme() + "://"+ request.getServerName() + ":" + request.getServerPort()+ path + "/";
//response.sendRedirect(contextPath+"/index.jsp");
// System.err.println("sendRedirect");
// 转发
if (StringUtils.equals("XMLHttpRequest", type)) {
// ajax请求
response.setHeader("SESSIONSTATUS", "TIMEOUT");
response.setHeader("CONTEXTPATH", basePath+"index.jsp");
response.setStatus(HttpServletResponse.SC_FORBIDDEN);//403 禁止
return false;
} else {
response.sendRedirect(basePath+"index.jsp");
return false;
}
}
return true;
}
return true;
}
}
继承这个拦截器的类就可以了 重写方法 然后在配置文件中加上:
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="main.java.com.hdd.core.Interceptor.LoginInterceptor">
</bean>
</mvc:interceptor>
</mvc:interceptors>
这个bean的位置就是你实现拦截器的位置
要说明的地方就是拦截器的实现中 ,如果直接使用response的重定向方法去重定向 那么一定会失败 因为用的是ajax ajax是异步数据 不会刷新网页 所以自然也不会去跳转页面 , 这个也算是一个使用不方面的地方吧 。所以需要改造一下ajax
选一个你的页面里都引入的js 或者是你用需要拦截ajax请求的界面 加入如下代码:
$.ajaxSetup( {
//设置ajax请求结束后的执行动作
complete :
function(XMLHttpRequest, textStatus) {
// 通过XMLHttpRequest取得响应头,sessionstatus
var sessionstatus = XMLHttpRequest.getResponseHeader("sessionstatus");
if (sessionstatus == "TIMEOUT") {
var win = window;
while (win != win.top){
win = win.top;
}
win.location.href= XMLHttpRequest.getResponseHeader("CONTEXTPATH");
}
}
});
ajaxSetup就是为了给ajax升级所预留的这样一个方法 然后complete函数就是ajax执行完后要执行的函数 无论是成功还是失败都要执行
在代码中可以看出 拦截器先获取了请求的头信息 如果是没有任何东西的 那么就是传统的同步请求 如果是XMLHttpRequest 就是ajax的异步请求 那么就在响应的头信息中放两个参数 用于ajax接受到后去执行
最后一点 这种方式的重定向 会让页面先弹出来一瞬间 然后再被重定向的页面所覆盖 让重定向的页面变为最高层级