필터를 전에 배웠지 만 필터는 서블릿을위한 것이며 SpringMVC 및 Spring Boots에서 사용됩니다. 기능 측면에서 그다지 유용하지 않습니다.
인터셉터에 대해 여기에서 배우자.
1. 인터셉터 실행 순서
1. 내용
2. 인터셉터
인터셉터에서 나는 3 개 (첫 번째, 2, 3)를 추가했지만 내용은 거의 동일합니다.
패키지 org.elvin.boot.interceptor; import org.springframework.web.servlet.handlerinterceptor; import org.springframework.web.servlet.modelandview; import javax.servlet.http.httpservletrequest; import javax.servlet.httpertor inversent; handlerinterceptor {@override public boolean prehandle (httpservletrequest httpservletrequest, httpservletresponse httpservletresponse, object o) 예외 {system.out.println ( "firstingrector prehandle"); 진실을 반환하십시오. } @override public void posthandle (httpservletrequest httpservletrequest, httpservletrepronse httpservletResponse httpservletResponse, modelandView ModelAndView)은 예외 {system.out.println ( "Firstintercrector Posthandle"); } @override public void afthCompletion (httpservletrequest httpservletrequest, httpservletrepronse httpservletrepronse, object o, exception e) 예외 {system.out.println ( "Firstinmerceptor pattmention"); }}다음 실행이 계속되기 전에 사전 핸드 핸드 리턴을 반환합니다.
인터셉터 등록 :
패키지 org.elvin.boot.interceptor; import org.springframework.context.annotation.configuration; import org.springframework.web.servlet.config.annotation.interceptorregistry; import org.spramework.web.servlet.config.annotation.webcconfigeratpter; RegisterInterceptor 확장 webmvcconfigureradapter {@override public void addinterceptors (interceptorregistry registry) {registry.addinterceptor (new firstinterceptor ()); registry.addinterceptor (new twointerceptor ()); registry.addinterceptor (new ThirdInterceptor ()); super.addinternceptors (레지스트리); }}실행 순서를 확인하기 위해 Thymeleaf가 여기에 사용 된 다음 배경에서 통과 한 속성에 전경에 액세스되었습니다. 액세스 할 때 정보가 콘솔에 인쇄됩니다.
package org.elvin.boot.pojo; public class book {개인 문자열 이름; public String getName () {System.out.println ( "보기 : Book'Name은" + name); 반환 이름; } public void setName (문자열 이름) {this.name = 이름; }}제어 장치:
package org.elvin.boot.controller; import org.elvin.boot.pojo.book; import org.springframework.stereotype.controller; import org.springframework.ui.model; import org.spramework.web.bind.annotation.getmapping; import org.springframework.web.bind.annotation.requestmapping;@controller@requestmapping ( "first") public class firstController {private String controllerpath = "first/"; @GetMapping ( "index") public String index (모델 모델) {System.out.println ( "컨트롤러 : FirstController index doing ..."); 책 책 = 새 책 (); book.setName ( "스프링 부츠"); model.addattribute ( "book", book); 반환 컨트롤러 경로 + "인덱스"; }}보다:
<! docType html> <html lang = "en"> <head> <meta charset = "utf-8"/> <title> title </title> </head> <body> <h1 th : text = "$ {book.name}"> </h1> </body> </html>LocalHost : 8080/First/Index에 액세스 할 때는 콘솔에서 응답 정보가 출력됩니다.
이러한 방식으로 단일 인터셉터의 실행 순서를 볼 수 있습니다.
1. 컨트롤러 방법이 실행되기 전에 실행 된 사전 핸들 방법
2. 컨트롤러 동작 방법을 실행하십시오
3. 조치를 실행 한 후,보기를 구문 분석하기 전에 (있는 경우), 인터셉터의 thonddle 메소드를 실행하십시오.
4.보기를 분석하십시오
5. 구문 분석 후에는 정수 방법을 실행하십시오
여러 인터셉터가 등록되면 실행 순서는 그림과 같이 표시됩니다.
2. 인터셉터는 권한 검증을 구현합니다
마찬가지로, 허가 인터셉터를 먼저 추가하십시오
패키지 org.elvin.boot.interceptor; import org.elvin.boot.nologin.nologin; import org.springframework.util.stringutils; import org.springframework.web.method.handlermed; import org.springframework.web.servlet.serverceptor; import org.springframework.web.servlet.modelandview; import javax.servlet.http.htttp.httpervletrequest; import javax.servlet.http.htttp.htttp.htttp.htttp.httpsession; public class internintercector mantments intercomestor anceptements handercector intercrector javax.servlet.http.httpession; 사전 핸들 (httpservletrequest 요청, httpservletresponse 응답, 객체 핸들) 예외 {handlermethod method = (handlermethod) 핸들; class <?> controllerType = method.getBeanType (); if (method.getMethodAnnotation (nologin.class)! = null || controllertype.getAntantation (nologin.class)! = null) {return true; } httpsession session = request.getSession (); String token = (String) session.getAttribute ( "Token"); if (! stringUtils.isempty (Token)) {return true; } response.sendRedirect ( "/login/index"); 거짓을 반환합니다. } @override public void posthandle (httpservletrequest httpservletrequest, httpservletrepronse httpservletresponse httpservletresponse, object o, modelandview modelandview)은 예외 {} @override popult completion (httpservletrequest httpervletreqleletrequest, htpervletrequest httpservletresponse, 객체 O, 예외 e) 예외 {}} 던지기그런 다음 허가 인터셉터를 등록하십시오
패키지 org.elvin.boot.interceptor; import org.springframework.context.annotation.configuration; import org.springframework.web.servlet.config.annotation.interceptorregistry; import org.spramework.web.servlet.config.annotation.webcconfigeratpter; RegisterInterceptor 확장 webmvcconfigureradapter {@override public void addinterceptors (interceptorregistry registry) {registry.addinterceptor (new logininterceptor ()); super.addinternceptors (레지스트리); }}로그인 컨트롤러를 컨트롤러에 추가하고 로그인 페이지 및 로그 아웃 방법 제공
package org.elvin.boot.controller; import org.elvin.annotation.nologin; import org.springframework.bean.beans.annotation.autowired; import org.springframework.stereotype.controller; import org.springframework.web.bind.annot.getmapping; org.springframework.web.bind.annotation.postmapping; import org.springframework.web.bind.annotation.requestmapping; import org.springframework.web.bind.annotation.responsebody; import javax.servlet.httpervletrequest; import; Javax.servlet.http.http.httpervletresponse; import javax.servlet.http.httpsession;@nologin@controller@requestmapping ( "login") 공개 클래스 logincontroller {@autowired private httpservletrequest 요청; @autowired 개인 httpservletresponse 응답; 개인 문자열 controllerpath = "로그인/"; // @nologin @getMapping ( "index") public string index () {httpsession session = request.getSession (); session.setattribute ( "토큰", "토큰"); 반환 컨트롤러 경로 + "인덱스"; } // @nologin @postmapping ( "checkout") @responsebody public string checkout () {httpsession session = requestsession (); session.setattribute ( "토큰", null); "OK"를 반환합니다. }}여기서 나는 로그인이없는 주석을 만들었습니다.이 주석은 컨트롤러 나 동작에 추가 될 수 있습니다.
Package org.elvin.boot.annotation; import java.lang.annotation.elementtype; import java.lang.annotation.retention; import java.lang.annotation.retentionpolicy; import java.lang.annotation.target; @target ({elementtype.type, ElementType.Method}) @retention (retentionpolicy.runtime) public @interface nologin {}주석에는 내용이 필요하지 않습니다.
로그인 페이지 (여기 로그인 페이지는 로그 아웃에 대한 것이므로이 페이지를 방문한 후 로그인이 성공했음을 의미합니다).
<! docType html> <html xmlns : th = "http://www.thymeleaf.org"> <head> <meta charset = "utf-8"/> <title> title> </title> </head> <body> <div> <input type "button"id = "checkout"/> </head> </head> </head> </head> </head "/</head> Th : src = "@{/js/jquery-1.11.1.1.1.1.1.1.js}"> </script> <script th : inline = "javaScript"> $ (function () {$ ( ". 컨테이너"). "#checkout", "click", function () {$ .Ajax (url : [{/login/checkout}],] {}, success (res) {res == "OK"{ "로그 아웃"); }); </script> </body> </html>결과 데모 방법 :
브라우저에서 먼저 http : // localhost : 8080/login/index 페이지를 열고 새 탭에서 http : // localhost : 8080/index 페이지에 액세스하십시오.
First/Index에 액세스 할 때 액세스 할 수 있습니다.
현재 로그인/색인 페이지에서 로그 아웃 버튼을 클릭하고 첫 번째/인덱스 페이지를 새로 고치면 로그인 페이지로 직접 이동합니다.
문자열 부팅 및 사용자 정의 인터셉터의 위의 예제는 내가 공유하는 모든 컨텐츠입니다. 나는 당신이 당신에게 참조를 줄 수 있기를 바랍니다. 그리고 당신이 wulin.com을 더 지원할 수 있기를 바랍니다.