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>
옵션 2, (대략) 총 인터셉터는 일치하는 URL을 가로챕니다.
<!-- 注解请求映射 --> <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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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

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

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

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

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


핫 AI 도구

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

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

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

WebStorm Mac 버전
유용한 JavaScript 개발 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

에디트플러스 중국어 크랙 버전
작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

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

VSCode Windows 64비트 다운로드
Microsoft에서 출시한 강력한 무료 IDE 편집기
