Spring MVC拦截器详解

来源:互联网 发布:php 常量定义 使用 编辑:程序博客网 时间:2024/05/18 01:45

SpringMVC拦截器

1 定义

java里的拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重用部分的方式。在AOP(Aspect-OrientedProgramming)中拦截器用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。SpringMVC 中的Interceptor 拦截器的主要作用是拦截用户的请求并进行相应的处理。比如通过它来进行权限验证,或者是登录认证等。

 

2 自定义拦截器

这里详解通过实现HandleInterceptor接口的方法。新建一个HandlerInterceptor的实现类,代码如下,该实现类中包括三个方法:

1)preHandle方法:该方法在controller执行前被调用,返回true表示继续执行,返回false表示终止执行。登录校验、权限拦截等可以写在此方法中。

2)postHandle方法:该方法在controller执行后但未返回ModelAndView之前被调用。一些公用信息可以被写在此方法中方便页面显示。

3)afterCompletion方法:该方法在controller执行完成后且已返回ModelAndView之后被调用。日志记录、异常返回等可写在此方法中。

 

Public class HandlerInterceptorCustomimplements HandlerInterceptor{

 

    @Override

    Public boolean preHandle(HttpServletRequestrequest,

           HttpServletResponseresponse, Object handler) throws Exception {

       // TODO Auto-generated method stub

       Return false;

    }

    @Override

    Public void postHandle(HttpServletRequestrequest,

           HttpServletResponseresponse, Object handler,

           ModelAndView modelAndView)throws Exception {

       // TODO Auto-generated method stub

      

    }

    @Override

    Public void afterCompletion(HttpServletRequestrequest,

           HttpServletResponseresponse, Object handler, Exception ex)

           throws Exception {

       // TODO Auto-generated method stub

    }

 

}

 

 

3 拦截器配置

配置文件添加如下代码:

 

<mvc:interceptors>

    <mvc:interceptor>

       <mvc:mappingpath="/**"/>

       <bean class="cn.itcast.springmvc.filter.HandlerInterceptorCustom"></bean>

    </mvc:interceptor>

    <mvc:interceptor>

       <mvc:mappingpath="/**"/>

       <bean class="cn.itcast.springmvc.filter.HandlerInterceptorCustom2"></bean>

    </mvc:interceptor>

</mvc:interceptors>

 

4 登录认证拦截器代码

public class LoginInterceptor implements HandlerInterceptor {

   //进入 Handler方法之前执行

   //用于身份认证、身份授权

   //比如身份认证,如果认证通过表示当前用户没有登陆,需要此方法拦截不再向下执行

   public boolean preHandle(HttpServletRequest request,

         HttpServletResponse response, Objecthandler)throws Exception {

      //获取请求的url

      String url = request.getRequestURI();

      //判断url是否是公开地址(实际使用时将公开地址配置配置文件中)

      //这里公开地址是登陆提交的地址

      if(url.indexOf("login.action")>=0){

         //如果进行登陆提交,放行

         return true;

      }   

      //判断session

      HttpSession session  = request.getSession();

      //session中取出用户身份信息

      String username = (String)session.getAttribute("username");

     

      if(username !=null){

         //身份存在,放行

         return true;

      }

      //执行这里表示用户身份需要认证,跳转登陆页面

      request.getRequestDispatcher("adminLogin.jsp").forward(request,response);   

      //return false表示拦截,不向下执行

      //return true表示放行

      return false;

   }

   //进入Handler方法之后,返回modelAndView之前执行

   //应用场景从modelAndView出发:将公用的模型数据(比如菜单导航)在这里传到视图,也可以在这里统一指定视图

   public void postHandle(HttpServletRequest request,

         HttpServletResponse response, Objecthandler,

         ModelAndView modelAndView)throws Exception {

     

   } 

   //执行Handler完成执行此方法

   //应用场景:统一异常处理,统一日志处理 

   public void afterCompletion(HttpServletRequest request,

         HttpServletResponse response, Objecthandler, Exceptionex)

         throws Exception {

   }

 

}

 

1 0
原创粉丝点击