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