>  기사  >  Java  >  Spring MVC 인터셉터에 대한 자세한 소개

Spring MVC 인터셉터에 대한 자세한 소개

巴扎黑
巴扎黑원래의
2017-09-08 09:43:361351검색

Spring MVC의 인터셉터는 HandlerMapping 수준에 있습니다. 각 HandlerMapping은 자체 인터셉터를 가질 수 있습니다.

Spring에서 제공하는

org. .HandlerInterceptor 인터페이스,
org.springframework.web.servlet.handler.HandlerInterceptorAdapter 어댑터,

이 인터페이스를 구현하거나 이 클래스를 상속하면 매우 편리하게 자신만의 인터셉터를 구현할 수 있습니다.

다음 세 가지 방법이 있습니다.

작업 전 실행:


 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 ex)

각각 전처리, 후처리(서비스가 호출되고 ModelAndView가 반환되지만 페이지가 렌더링되지 않음) 및 반환 처리(페이지가 렌더링됨)를 구현합니다.

preHandle에서는 인코딩, 보안 제어 등이 가능합니다.

postHandle에는 ModelAndView를 수정할 수 있는 기회가 있습니다.

완료 후 예외가 발생했는지 확인하고 ex가 null인지 여부에 따라 기록할 수 있습니다.

매개변수의 개체 핸들러가 다음 인터셉터입니다.

인터셉터를 사용하는 방법은 무엇입니까?

인터셉터를 사용자 정의하려면 HandlerInterceptor 인터페이스를 구현해야 합니다.

Java 코드


public class MyInteceptor implements HandlerInterceptor {   
  略。。。 
}

Spring MVC에는 전체 인터셉터가 없으며 전후의 모든 요청을 인터셉트할 수 없습니다.

Spring MVC의 인터셉터는 HandlerMapping 수준에 있습니다. 여러 HandlerMapping이 있을 수 있으며 각 HandlerMapping은 자체 인터셉터를 가질 수 있습니다.

요청이 Order 값에 따라 작은 것부터 큰 것 중 먼저 반환되는 값에 따라 HandlerMapping 인터페이스의 구현 클래스를 순차적으로 실행하면 후속 HandlerMapping이 사라지지 않고 이 프로세스가 완료됩니다. 다음 과정으로 넘어가시면 됩니다.

인터셉터는 언제 실행되나요? 요청이 HandlerMapping으로 전달되면 HandlerMapping은 먼저 요청을 처리할 프로세서를 찾습니다. 이를 찾으면 인터셉터를 실행한 후 대상 프로세서에 전달합니다.

핸들러가 발견되지 않으면 이 인터셉터는 실행되지 않습니다.

spring MVC 구성 파일에는 세 가지 방법을 구성할 수 있습니다.

옵션 1, (대략) 전체 인터셉터, 모든 URL 차단

Java 코드


  <mvc:interceptors> 
  <bean class="com.app.mvc.MyInteceptor" /> 
</mvc:interceptors>

"대략"이라고 불리는 이유 , 앞서 말했듯이 Spring에는 전체 인터셉터가 없습니다.

7e1c76f056e5a23401b3d31dc10adfa0는 각 HandlerMapping에 인터셉터를 주입합니다. 프로세서를 찾을 수 있는 HandlerMapping이 항상 있고 최대 하나의 프로세서만 찾을 수 있으므로 이 인터셉터는 항상 실행됩니다. 전체 인터셉터 역할을 합니다. 7e1c76f056e5a23401b3d31dc10adfa0会为每一个HandlerMapping,注入一个拦截器。总有一个HandlerMapping是可以找到处理器的,最多也只找到一个处理器,所以这个拦截器总会被执行的。起到了总拦截器的作用。

如果是REST风格的URL,静态资源也会被拦截。

方案二, (近似) 总拦截器, 拦截匹配的URL。

Xml代码  


<mvc:interceptors >  
 <mvc:interceptor>  
    <mvc:mapping path="/user/*" /> <!-- /user/* -->  
    <bean class="com.mvc.MyInteceptor"></bean>  
  </mvc:interceptor>  
</mvc:interceptors>

就是比 方案一多了一个URL匹配。

如果是REST风格的URL,静态资源也会被拦截。

方案三,HandlerMappint上的拦截器。

如果是REST风格的URL,静态资源就不会被拦截。因为我们精准的注入了拦截器。

Xml代码  


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

如果使用了463d7d566f84e66ad507872587b9c14c, 它会自动注册DefaultAnnotationHandlerMapping 与AnnotationMethodHandlerAdapter 这两个bean,所以就没有机会再给它注入interceptors属性,就无法指定拦截器。

当然我们可以通过人工配置上面的两个Bean,不使用 463d7d566f84e66ad507872587b9c14c,就可以 给interceptors属性 注入拦截器了。

其实我也不建议使用 463d7d566f84e66ad507872587b9c14c,而建议手动写详细的配置文件,来替代 463d7d566f84e66ad507872587b9c14c,这就控制力就强了。

如何替换 463d7d566f84e66ad507872587b9c14c?他到底做了什么工作?

一句 463d7d566f84e66ad507872587b9c14c

REST 스타일 URL인 경우 정적 리소스도 가로채게 됩니다.

옵션 2, (대략) 총 인터셉터는 일치하는 URL을 가로챕니다.

Xml 코드


🎜
 <!-- 注解请求映射 --> 
  <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">     
  <property name="interceptors"> 
    <list>  
      <ref bean="logNDCInteceptor"/>  <!-- 日志拦截器,这是你自定义的拦截器 --> 
      <ref bean="myRequestHelperInteceptor"/>  <!-- RequestHelper拦截器,这是你自定义的拦截器-->  
      <ref bean="myPermissionsInteceptor"/> <!-- 权限拦截器,这是你自定义的拦截器-->  
      <ref bean="myUserInfoInteceptor"/> <!-- 用户信息拦截器,这是你自定义的拦截器-->  
    </list>     
  </property>     
</bean>   
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
  <property name="messageConverters">  
    <list>  
      <ref bean="byteArray_hmc" />  
      <ref bean="string_hmc" />  
      <ref bean="resource_hmc" />  
      <ref bean="source_hmc" />  
      <ref bean="xmlAwareForm_hmc" />  
      <ref bean="jaxb2RootElement_hmc" />  
      <ref bean="jackson_hmc" />  
    </list>  
  </property>  
</bean>  
<bean id="byteArray_hmc" class="org.springframework.http.converter.ByteArrayHttpMessageConverter" /><!-- 处理.. --> 
<bean id="string_hmc" class="org.springframework.http.converter.StringHttpMessageConverter" /><!-- 处理.. --> 
<bean id="resource_hmc" class="org.springframework.http.converter.ResourceHttpMessageConverter" /><!-- 处理.. --> 
<bean id="source_hmc" class="org.springframework.http.converter.xml.SourceHttpMessageConverter" /><!-- 处理.. --> 
<bean id="xmlAwareForm_hmc" class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter" /><!-- 处理.. --> 
<bean id="jaxb2RootElement_hmc" class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter" /><!-- 处理.. --> 
<bean id="jackson_hmc" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" /><!-- 处理json-->
🎜는 옵션 1보다 URL 일치가 하나 더 많습니다. 🎜🎜REST 스타일 URL인 경우 정적 리소스도 가로채게 됩니다. 🎜🎜🎜옵션 3, HandlerMapint의 인터셉터. 🎜🎜REST 스타일 URL인 경우 정적 리소스를 가로채지 않습니다. 인터셉터를 정확하게 주입했기 때문이죠. 🎜🎜Xml 코드 🎜🎜🎜🎜rrreee🎜 463d7d566f84e66ad507872587b9c14c, 를 사용하면 DefaultAnnotationHandlerMapping과 AnnotationMethodHandlerAdapter 두 개의 Bean이 자동으로 등록되므로 줄 기회가 없습니다. 다시 Interceptors 속성을 주입하면 인터셉터를 지정할 수 없습니다. 🎜🎜물론 f7ba1f27e11c63617ca69c495697dd74을 사용하지 않고 위의 두 빈을 수동으로 구성한 다음 인터셉터 속성에 인터셉터를 주입할 수 있습니다. 🎜🎜🎜사실 저는 463d7d566f84e66ad507872587b9c14c,를 사용하는 것을 권장하지 않지만, <mvc:annotation-driven / 대신 세부 구성 파일을 수동으로 작성하는 것을 권장합니다. &gt ;, 이렇게 하면 더 강력한 제어가 가능해집니다. 🎜🎜463d7d566f84e66ad507872587b9c14c를 어떻게 교체하나요? 그는 정확히 무엇을 했나요? 🎜🎜한 문장 463d7d566f84e66ad507872587b9c14c은 실제로 다음 작업을 수행합니다. (자신이 정의한 인터셉터 추가 제외) 🎜🎜이를 이해한 후에는 Spring3 MVC에 대한 제어가 더 중요해집니다. 강력하므로 원하는 곳 어디에서나 변경할 수 있습니다. 🎜🎜Xml 코드 🎜🎜🎜🎜🎜rrreee

위 내용은 Spring MVC 인터셉터에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.