1. 개요
인터셉터는 특히 슬라이스 프로그래밍의 인기 가후 점점 더 많이 사용됩니다. 그렇다면 인터셉터는 일반적으로 무엇을 할 수 있습니까?
에이전트 소개에서 우리는 통계 기능의 호출에 시간이 걸린다고 언급했습니다. 이 아이디어는 실제로 AOP의 서라운드 향상과 정확히 동일합니다.
일반적으로 시나리오는 다음과 같습니다.
그리고 다른 사람들 등.
2. 스프링의 인터셉터
SpringMVC이든 SpringBoot이든 인터셉터를 언급해야합니다.
org.springframework.web.servlet.handler.handlerinterceptoradapter
공개 초록 클래스 핸들러 interceptoradapter는 Asynchandlerinterceptor를 구현합니다 {// @override public boolean prehandle (httpservletrequest request, httpservletreponse 응답, 객체 처리기)은 예외 {return true; } // 대상 메소드가 실행 된 후 실행되지만 요청이 반환되기 전에 ModelAndView @Override Public Void PosthAndle (httpservletrequest request, httpservletResponse 응답, 객체 처리기, ModelView ModelView)을 여전히 수정할 수 있습니다} // execute public void (htpervletrequestion public void). httpservletresponse 응답, 객체 처리기, 예외 예외)는 비동기 요청을 처리하는 데 사용되는 예외 {} // 던졌습니다. 이 메소드는 컨트롤러 @override public void afterconcurrenthandlingStarted (httpservletrequest request, httpservletResponse 응답, 개체 핸들러)에 비동기 요청 메소드가있을 때 트리거됩니다. 예외 {}}.간단한 권한을 확인하기위한 인터셉터를 구현하십시오
1. 권한 주석 @Auth를 사용자 정의하십시오
@inherited@target ({elementtype.type, elementtype.method})@resentention(retentionpolicy.runtime)@documentedpublic @interface auth {string user () default ";}2. 컨트롤러 방법에 주석을 추가하십시오
이전 단계에서 주석을 추가 한 후 다음과 같이 사용중인 메소드에 관련 주석을 추가해야합니다.
@restController @enableAutoConfigurationPublic Class DemoController {@auth (user = "admin") @requestmapping (value = "/hello", method = requestmethod.get) public string sayhello () {return "Hello World."; }}3. 인터셉터 함수를 구현하십시오
요구 사항 : 사용자가 /hello를 통해 URI에 액세스하면 확인됩니다. 관리자 인 경우 릴리스됩니다. 그렇지 않으면 거부됩니다. 사용자의 신원이 URL 매개 변수에 있다고 가정하십시오.
아이디어 : 따라서 SERHELLO ()를 실행하기 전에 사용자를 확인해야합니다. 그 정체성이 주석의 정체성과 동일하다면, 그것은 공개됩니다. 따라서 우리는 사전 핸드 ()에서 소란을 만들어야합니다 ().
난이도 : 컨트롤러 방법에 대한 @Auth 주석을 어떻게 얻습니까? prehandle ()의 세 가지 매개 변수를 살펴보면 아무도 컨트롤러 클래스에서 주석을 제공 할 수없는 것 같습니다.
실제로, 세 번째 매개 변수 핸들러는 일반적으로 다음 유형은 다음과 같습니다.
왜 그렇게 말합니까?
SpringBoot에서는 기본 주석 유형이 함수 레벨이고 SpringMVC에서는 기본 유형이 컨트롤러 객체 수준입니다.
따라서 SpringMVC의 Dispatcher-Servlet.xml에서 구성 해야하는 경우 :
<bean/>, 그 유형이 핸드머 메드가되도록합니다.
특정 구현 로직을 살펴 보겠습니다.
@override public boolean prehandle (httpservletrequest request, httpservletresponse 응답, 객체 처리기)은 예외 {system.out.println ( "prehandle")을 던집니다. if (! handler.getClass (). IsAssignableFrom (handlerMethod.class)) {system.out.println ( "핸드 맨드로서 Cat Cast handler to handlermethod.class"); 진실을 반환하십시오. } // annotation auth auth = ((handlermethod) handler) .getMethod (). getAnnotation (auth.class); if (auth == null) {system.out.println ( "이 uri에서 @auth를 찾을 수 없습니다 :" + request.getRequesturi ()); 진실을 반환하십시오. } // 매개 변수에서 사용자의 신원을 꺼내어 문자열 admin = auth.user (); if (! admin.equals (request.getParameter ( "user"))) {System.out.println ( "권한 거부"); Response.SetStatus (403); 거짓을 반환합니다. } true를 반환합니다. }실제로 구현 로직에는 두 가지 점이 있습니다. 매개 변수에서 신원을 꺼내 주석과 비교하십시오.
4. 인터셉터를 구성합니다
그렇다면 인터셉터가 어떻게 효과적 일 수 있습니까?
현재 webmvcconfigureradapter를 구성해야합니다
특정 구현은 다음과 같습니다.
@ConfigurationPublic Class ConfigAdapter는 webmvcconfigureradapter {@override public void addinterceptors (interceptorregistry registry) {registry.addinterceptor (new logininterceptor ()). AddPathPatterns ( "/hello"); }}참고 : 여기에는 두 가지 점이 있습니다. 하나는 @Configuration 주석이므로 SpringBoot 서비스 가이 구성을 발견 할 수 있습니다. 다른 하나는 "/hello"를 가로 채는 구성 일치입니다. ( "/**"는 모든 액세스를 차단하는 것입니다)
4. 운영
http://127.0.0.1:8080/hello?user=admin을 방문하여 결과를 확인하십시오.
이 기사의 코드에 대한 자세한 내용은 다음을 참조하십시오. https://github.com/hawkingfoo/springboot interceptor
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.