springMVC学习 十二 拦截器

一 拦截器概述

  拦截器技术比较像java web技术中的过滤器技术,都是发送 请求时被拦截器拦截,在控制器的前后添加额外功能。但是和Spring中的Aop技术是由区别的。AOP 在特定方法前后扩充(一般是对 ServiceImpl的方法进行扩充),而拦截器是对控制器的请求进行拦截。

  但是拦截器和java web的过滤器也是有区别的,拦截器只能拦截控制器的请求,对jsp和静态资源不拦截,因为拦截器是SpingMVC的技术,SpringMVC的总入口是DispatcherServlet,我们在配置DsipatcherServlet时,就已经把DispatcherServlet可以接收的请求限定为Controller的请求。而Java Web中的 Filter 可以拦截任何请求。

二 实现自定义拦截器

第一步:创建一个拦截器类,并继承HandlerInterceptor接口

在HandlerInterceptor接口中有三个方法

(1)preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2)

执行时间:控制器之前执行
如果返回值为true,则放行到控制器,

如果返回值为false,直接返回,不放行,
一般情况下,如果不放行,一般会sendRedirect("")让其跳转到一个特定的页面,

arg2:要拦截的控制器的方法
 


(2)
postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)throws Exception

执行时间:控制器之后,jsp执行之前 执行,如果控制器抛出了异常,便不会走该方法
arg3:模型和视图
功能:一般用来记录日志,或者敏感词过滤
structs的后置拦截器是无法修改ModelAndView,但是springMVC是可以修改的,也就是ModelAndView的值是可以修改的

(3)afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception 

执行时间:执行完jsp之后才执行
      
根据arg3参数是否为null来判断是否出现了异常
无论是否出现异常,该方法都会执行,因为有一个Exception类型的参数,因此可以用来记录异常
 
 
 
package com.ssm.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class DemoInterceptor implements HandlerInterceptor{

    

    /**
     * 控制器之前执行,如果返回值为true,则放行到控制器,如果返回值为false,直接返回,不放行,一般情况下,如果不放行,一般会sendRedirect("")
     * 让其跳转到一个页面
     * arg2:要拦截的控制器的方法
     */
    @Override
    public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
        
        System.out.println("preHandle方法执行了");
        return true;
    }
    /**
     * 控制器之后,jsp执行之前 执行,如果控制器抛出了异常,便不会走该方法
     * arg3:模型和视图
     * 功能:一般用来记录日志,或者敏感词过滤
     * structs的后置拦截器是无法修改ModelAndView,但是springMVC是可以修改的,也就是ModelAndView的值是可以修改的
     */
    @Override
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
            throws Exception {
        System.out.println("postHandle 方法执行了");
        System.out.println(arg3.getViewName());
        System.out.println(arg3.getView());
        
        System.out.println(arg3.getModel().get("modelKye"));
        
    }
    /**
     * 执行完jsp之后才执行
     * 
     * 根据arg3参数是否为null来判断是否出现了异常
     * 无论是否出现异常,该方法都会执行,因为有一个Exception类型的参数,因此可以用来记录异常
     */
    @Override
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {
        System.out.println("afterCompletion方法执行了");
        
    }


}

三 配置拦截器,就像Filter一样,拦截器也需要配置

在SpringMVC的配置文件中进行配置,有两种配置方式,一种是拦截所有请求,第二种是拦截特定请求。

下面的代码是拦截所有请求,拦截特定请求的被注释了

<!-- 配置拦截器 -->
    <mvc:interceptors>
        <!-- 表示所有的控制器请求都拦截 -->
        <bean class="com.ssm.interceptor.DemoInterceptor"></bean>
        <!-- 拦截特定请求 -->
        <!-- <mvc:interceptor>
            <mvc:mapping path="/demo"/>
            <bean class="com.ssm.interceptor.DemoInterceptor"></bean>
        </mvc:interceptor> -->
    </mvc:interceptors>

猜你喜欢

转载自www.cnblogs.com/cplinux/p/9824188.html