• springMVC3学习(七)--Interceptor拦截器


    版权声明:本文为博主原创文章,未经博主同意不得转载。 https://blog.csdn.net/itmyhome/article/details/26286107

    Spring为我们提供了:org.springframework.web.servlet.HandlerInterceptor接口,

    org.springframework.web.servlet.handler.HandlerInterceptorAdapter适配器,

    实现这个接口或继承此类,能够很方便的实现自己的拦截器。

    有下面三个方法:

    Action之前运行

    public boolean preHandle(HttpServletRequest request,
    			HttpServletResponse response, Object handler)

    生成视图之前运行

    public void postHandle(HttpServletRequest request,
    			HttpServletResponse response, Object handler, ModelAndView modelAndView)

    最后运行,可用于释放资源

    public void afterCompletion(HttpServletRequest request,
    			HttpServletResponse response, Object handler, Exception e)

    分别实现预处理、后处理(调用了Service并返回ModelAndView。但未进行页面渲染)、返回处理(已经渲染了页面)

    在preHandle中,能够进行编码、安全控制等处理;

    在postHandle中,有机会改动ModelAndView;

    在afterCompletion中,能够依据ex是否为null推断是否发生了异常。进行日志记录。

    參数中的Object handler是下一个拦截器。


    怎样使用拦截器

    自己定义一个拦截器,要实现HandlerInterceptor接口:

    public class MyInterceptor implements HandlerInterceptor {...}

    在springMVC的配置文件里配置有三种方法

    一、拦截全部URL

    <mvc:interceptors>
    	<bean class="com.itmyhome.MyInterceptor" />
    </mvc:interceptors>

    二、拦截匹配的URL

    <mvc:interceptors>
    	<mvc:interceptor>
    		<mvc:mapping path="/login" />
    		<bean class="com.itmyhome.MyInterceptor"></bean>
    	</mvc:interceptor>
    </mvc:interceptors>

    三、HandlerMappint上的拦截器

    <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    	<property name="interceptors">
    		<list>
    			<bean class="com.itmyhome.MyInterceptor"></bean>
    		</list>
    	</property>
    </bean>

    假设使用了<mvc:annotation-driven />, 它会自己主动注冊DefaultAnnotationHandlerMapping 与

    AnnotationMethodHandlerAdapter 这两个bean,所以就没有机会再给它注入interceptors属性,就无法指定拦截器。

    当然我们能够通过人工配置上面的两个Bean。不使用 <mvc:annotation-driven />,

    就能够给interceptors属性注入拦截器了。


    拦截器MyInterceptor类

    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    
    public class MyInterceptor implements HandlerInterceptor {
    
    	public void afterCompletion(HttpServletRequest request,
    			HttpServletResponse response, Object handler, Exception e)
    			throws Exception {
    		System.out.println("******afterCompletion******");
    
    	}
    
    	public void postHandle(HttpServletRequest request,
    			HttpServletResponse response, Object handler, ModelAndView arg3)
    			throws Exception {
    		System.out.println("******postHandle******");
    
    	}
    
    	/**
    	 * 假设返回false 从当前拦截器往回运行全部拦截器的afterCompletion方法,再退回拦截器链 假设返回true
    	 * 运行下一个拦截器,直到全部拦截器都运行完成 再运行被拦截的Controller
    	 * 然后进入拦截器链从最后一个拦截器往回运行全部拦截器的postHandle方法
    	 * 接着依然是从最后一个拦截器往回运行全部拦截器的afterCompletion方法
    	 */
    	public boolean preHandle(HttpServletRequest request,
    			HttpServletResponse response, Object handler) throws Exception {
    		System.out.println("******preHandle******");
    		return true;
    	}
    }

    spring配置文件

    <!-- 拦截所以URL
    <mvc:interceptors>
    	<bean class="com.itmyhome.MyInterceptor" />
    </mvc:interceptors>
     -->
     <!-- 拦截匹配URL -->
    <mvc:interceptors >
    	<mvc:interceptor>
    		<mvc:mapping path="/login" />
    		<bean class="com.itmyhome.MyInterceptor"></bean>
    	</mvc:interceptor>
    </mvc:interceptors>
    
    <!-- HandlerMappint上的拦截器
    <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    	<property name="interceptors">
    		<list>
    			<bean class="com.itmyhome.MyInterceptor"></bean>
    		</list>
    	</property>
    </bean>-->
    
    
    <!-- 默认扫描的包路径-->
    <context:component-scan base-package="com.itmyhome" /> 
    <!-- 加入注解驱动 -->
    <mvc:annotation-driven />
    
    <!-- 假设使用HandlerMappint拦截器则凝视以上注冊驱动的方法,使用下面人工配置bean -->
    <!--  <bean class="com.itmyhome.Login"></bean>-->
    
    <!-- 处理器 -->
    <bean name="/login" class="com.itmyhome.Login"></bean>
    
    <!-- HandlerMapping 
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>-->
    <!-- HandlerAdapter 
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>-->
    
    <!-- 定义跳转的文件的前后缀 -->
    <bean id="viewResolver"
    	class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    	<property name="prefix" value="/" />  <!-- 默认放在WebRoot下 -->
    	<property name="suffix" value=".jsp" /> 
    </bean>

    測试URL:http://localhost:8080/spring_Interceptor/login

    查看后台会运行拦截器代码

    项目源代码下载:http://download.csdn.net/detail/itmyhome/7372023



  • 相关阅读:
    从boosting谈起
    《人月神话》读书摘记
    Python中input()的使用方法
    Web前端攻击方式及防御措施
    吞吐量(TPS)、QPS、并发数、响应时间(RT)概念
    Mybatis的Mapper文件sql语句中使用常量值或者枚举常量值
    Java依据文件头获取文件类型
    MySQL查询优化
    RabbitMQ学习教程
    SpringBoot2.x.x + Shiro + Redis 前后端分离实现
  • 原文地址:https://www.cnblogs.com/ldxsuanfa/p/10548377.html
  • Copyright © 2020-2023  润新知