拦截器的概念
java里的拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action
执行前阻止其执行,同时也提供了一种可以提取Action中可重用部分代码的方式。在AOP中,拦截器用于在某个方法或者字段被访问之前,进行拦截
然后再之前或者之后加入某些操作。目前,我们需要掌握的主要是Spring的拦截器,Struts2的拦截器不用深究,知道即可。
和过滤器相似,继承HandlerInterceptor接口,重构preHandler方法
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//在执行前进行拦截,若拦截成功,返回true
//1.获取session
HttpSession session = request.getSession();
//获取登录url。这个url是不进行拦截的
String url = request.getRequestURI();
// if (session.getAttribute("userInfo")!=null||url.indexOf("userInfoController/doLogin.do")!=-1){
//登陆成功,不拦截。
if (session.getAttribute("userInfo")!=null){
return true;
}else {
//拦截后重新返回登录界面
response.sendRedirect(request.getContextPath()+"/userInfoController/doLogin.do");
return false;
}
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//在处理过程中进行拦截
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//执行完毕,再返回前拦截
}
}
拦截器是在Spring层中实现的,所以配置也要在Spring配置文件中加入
<mvc:interceptors>
<mvc:interceptor>
<!--拦截所有的mvc控制器-->
<mvc:mapping path="/**"/>
<!--放行login.do-->
<mvc:exclude-mapping path="/userInfoController/doLogin.do"/>
<!--告诉使用哪一个拦截器-->
<bean class="com.zrgj.interceptor.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>