最近做的一个后台管理系统要做一些url拦截,如果未登录的用户是无法访问管理主页(index),然后自动跳转到登录界面,原来我一直用的是很弱智的方法(在每个jsp页面进行session校验),现在想起来好麻烦呀!
虽然可以为达到目的不择手段,但是有好手段的话要试一下好手段嘛!
今天get到了一个小技巧:Spring中的interceptor(拦截器)
在配置文件application-web.xml中进行如下的配置:
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/login/**"/>
<mvc:exclude-mapping path="/css/**"/>
<mvc:exclude-mapping path="/js/**"/>
<mvc:exclude-mapping path="/images/**"/>
<mvc:exclude-mapping path="/api/**"/>
<bean class="org.imooc.controller.interceptor.SessionInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
说明:
<mvc:mapping path="/**"/>//表示你要过滤的路径(也就是访问的url),这里过滤所有访问
//不能把所有的路径都过滤呀,要不怎么访问,下面的标签就是用来排除我们要使用的路径
<mvc:exclude-mapping path="/login/**"/> //login用于登录所以本不能拦截
<mvc:exclude-mapping path="/css/**"/> //css要是被拦截的话登录界面会变得很丑,所以不能拦截
<mvc:exclude-mapping path="/js/**"/> //同理,js也不能拦截
<mvc:exclude-mapping path="/images/**"/> //同理,图片也不能拦截
<mvc:exclude-mapping path="/api/**"/> //前端接口就更不能拦截了
<bean class="org.imooc.controller.interceptor.SessionInterceptor"></bean> //进行拦截处理的类
下面我们 看一下这个bean(实现HandlerInterceptor接口)
需要实现三个方法;
package org.imooc.controller.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.imooc.constant.SessionKeyConst;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
/**
*session 拦截器
*/
public class SessionInterceptor implements HandlerInterceptor{
/**
* 在进入Handler方法之间执行
* @return true:继续执行下一个拦截器,直到所有拦截器执行完再执行Controller
* false:从当前的拦截器往回执行所有拦截器的afterCompletion()方法,然后退出拦截器链,无法执行Controller
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
if(request.getSession().getAttribute(SessionKeyConst.USER_INFO)!=null){ //进行session校验
return true;
}
request.getRequestDispatcher("/login/sessionTimeout").forward(request, response); //跳转到错误页面
return false;
}
/**
* 在进入Handler方法之后,返回ModelAndView之前执行
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
}
/**
* Handler方法执行之后执行
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// TODO Auto-generated method stub
}
}