• 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>
  • 相关阅读:
    使用WPF Tree Visualizer 查看popup的Dialog
    用代码控制build,相关资料搜集
    AreComObjectsAvailableForCleanup and CleanupUnusedObjectsInCurrentContext
    window size in Windows User Experience Interaction Guidelines
    有关PFIF
    应用程序挂起的秘密
    How do I determine if a WPF window is modal?
    Associate extension with c# exe
    提升WPF的启动速度
    Marshal.ReleaseComObject
  • 原文地址:https://www.cnblogs.com/cplinux/p/9824188.html
Copyright © 2020-2023  润新知