찾다
Javajava지도 시간Spring MVC 인터셉터에 대한 자세한 소개

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

Sep 08, 2017 am 09:43 AM
spring소개하다가로채기

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에는 전체 인터셉터가 없습니다.

<interceptors></interceptors>는 각 HandlerMapping에 인터셉터를 주입합니다. 프로세서를 찾을 수 있는 HandlerMapping이 항상 있고 최대 하나의 프로세서만 찾을 수 있으므로 이 인터셉터는 항상 실행됩니다. 전체 인터셉터 역할을 합니다. <interceptors></interceptors>会为每一个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>

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

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

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

如何替换 <annotation-driven></annotation-driven>?他到底做了什么工作?

一句 <annotation-driven></annotation-driven>

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🎜 <annotation-driven></annotation-driven>, 를 사용하면 DefaultAnnotationHandlerMapping과 AnnotationMethodHandlerAdapter 두 개의 Bean이 자동으로 등록되므로 줄 기회가 없습니다. 다시 Interceptors 속성을 주입하면 인터셉터를 지정할 수 없습니다. 🎜🎜물론 <annotation-driven></annotation-driven>을 사용하지 않고 위의 두 빈을 수동으로 구성한 다음 인터셉터 속성에 인터셉터를 주입할 수 있습니다. 🎜🎜🎜사실 저는 <annotation-driven></annotation-driven>,를 사용하는 것을 권장하지 않지만, , 이렇게 하면 더 강력한 제어가 가능해집니다. 🎜🎜<annotation-driven></annotation-driven>를 어떻게 교체하나요? 그는 정확히 무엇을 했나요? 🎜🎜한 문장 <annotation-driven></annotation-driven>은 실제로 다음 작업을 수행합니다. (자신이 정의한 인터셉터 추가 제외) 🎜🎜이를 이해한 후에는 Spring3 MVC에 대한 제어가 더 중요해집니다. 강력하므로 원하는 곳 어디에서나 변경할 수 있습니다. 🎜🎜Xml 코드 🎜🎜🎜🎜🎜rrreee

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

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
고급 Java 프로젝트 관리, 구축 자동화 및 종속성 해상도에 Maven 또는 Gradle을 어떻게 사용합니까?고급 Java 프로젝트 관리, 구축 자동화 및 종속성 해상도에 Maven 또는 Gradle을 어떻게 사용합니까?Mar 17, 2025 pm 05:46 PM

이 기사에서는 Java 프로젝트 관리, 구축 자동화 및 종속성 해상도에 Maven 및 Gradle을 사용하여 접근 방식과 최적화 전략을 비교합니다.

적절한 버전 및 종속성 관리로 Custom Java 라이브러리 (JAR Files)를 작성하고 사용하려면 어떻게해야합니까?적절한 버전 및 종속성 관리로 Custom Java 라이브러리 (JAR Files)를 작성하고 사용하려면 어떻게해야합니까?Mar 17, 2025 pm 05:45 PM

이 기사에서는 Maven 및 Gradle과 같은 도구를 사용하여 적절한 버전 및 종속성 관리로 사용자 정의 Java 라이브러리 (JAR Files)를 작성하고 사용하는 것에 대해 설명합니다.

카페인 또는 구아바 캐시와 같은 라이브러리를 사용하여 자바 애플리케이션에서 다단계 캐싱을 구현하려면 어떻게해야합니까?카페인 또는 구아바 캐시와 같은 라이브러리를 사용하여 자바 애플리케이션에서 다단계 캐싱을 구현하려면 어떻게해야합니까?Mar 17, 2025 pm 05:44 PM

이 기사는 카페인 및 구아바 캐시를 사용하여 자바에서 다단계 캐싱을 구현하여 응용 프로그램 성능을 향상시키는 것에 대해 설명합니다. 구성 및 퇴거 정책 관리 Best Pra와 함께 설정, 통합 및 성능 이점을 다룹니다.

캐싱 및 게으른 하중과 같은 고급 기능을 사용하여 객체 관계 매핑에 JPA (Java Persistence API)를 어떻게 사용하려면 어떻게해야합니까?캐싱 및 게으른 하중과 같은 고급 기능을 사용하여 객체 관계 매핑에 JPA (Java Persistence API)를 어떻게 사용하려면 어떻게해야합니까?Mar 17, 2025 pm 05:43 PM

이 기사는 캐싱 및 게으른 하중과 같은 고급 기능을 사용하여 객체 관계 매핑에 JPA를 사용하는 것에 대해 설명합니다. 잠재적 인 함정을 강조하면서 성능을 최적화하기위한 설정, 엔티티 매핑 및 모범 사례를 다룹니다. [159 문자]

Java의 클래스로드 메커니즘은 다른 클래스 로더 및 대표 모델을 포함하여 어떻게 작동합니까?Java의 클래스로드 메커니즘은 다른 클래스 로더 및 대표 모델을 포함하여 어떻게 작동합니까?Mar 17, 2025 pm 05:35 PM

Java의 클래스 로딩에는 부트 스트랩, 확장 및 응용 프로그램 클래스 로더가있는 계층 적 시스템을 사용하여 클래스로드, 링크 및 초기화 클래스가 포함됩니다. 학부모 위임 모델은 핵심 클래스가 먼저로드되어 사용자 정의 클래스 LOA에 영향을 미치도록합니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
1 몇 달 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
1 몇 달 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
1 몇 달 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 채팅 명령 및 사용 방법
1 몇 달 전By尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

WebStorm Mac 버전

WebStorm Mac 버전

유용한 JavaScript 개발 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

에디트플러스 중국어 크랙 버전

에디트플러스 중국어 크랙 버전

작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

VSCode Windows 64비트 다운로드

VSCode Windows 64비트 다운로드

Microsoft에서 출시한 강력한 무료 IDE 편집기