私は以前にフィルターを学びましたが、フィルターはサーブレット用であり、SpringMVCおよびSpringブーツで使用されています。機能の面ではあまり役に立たないと感じています。
ここでインターセプターについて学びましょう。
1。インターセプターの実行順序
1。内容
2。インターセプター
インターセプターでは、3つ(最初、2、3)を追加しましたが、内容はほぼ同じです。
Package org.elvin.boot.interceptor; Import org.springframework.web.servlet.handlerInterceptor; Import org.springframework.web.servlet.modelandview; Import javax.servlet.servlet.http.httpserpletrequest; Import.http.httptsptsptsptsptsptsptsptsptsptprespest HandlerInterceptor {@Override public boolean prehandle(httpservletrequest、httpservletrequest、httpservletresponse httpservletresponse、object o)スロー例外{system.out.println( "first interceptor prehandle"); trueを返します。 } @Override public void posthandle(httpservletrequest httpservletrequest、httpservletResponse httpservletResponse、object o、modelandview modelandview)スロー{system.out.println( "Firstinterceptor poshandle"); } @Override public void aftercompletion(httpservletrequest httpservletrequest、httpservletResponse httpservletResponse、オブジェクトO、例外E)例外{System.out.println( "FirstInterceptor afcompomedion"); }}PreHandleは、次の実行が継続する前にtrueを返します。
インターセプター登録:
Package.elvin.boot.interceptor; Import org.springframework.context.annotation.configuration; import org.springframework.web.servlet.config.annotation.interceptorregistristristry; Import org.springframework.web.servlet.config.annotation.notation.webmvcconfigureradapter class RegisterInterceptorは、webmvcconfigureradapterを拡張します{@override public void addInterceptors(interceptorregistry registry){registry.addInterceptor(new firstinterceptor()); registry.addInterceptor(new TwoInterceptor()); registry.AddDINTERCEPTOR(new ThirdInterceptor()); Super.AddDINTERCEPTORS(レジストリ); }}実行順序を検証するために、ここでは胸腺が使用され、バックグラウンドで通過したプロパティがフォアグラウンドでアクセスされました。アクセスすると、情報はコンソールに印刷されます
パッケージorg.elvin.boot.pojo; public class book {private string name; public String getName(){System.out.println( "View:book'name is" + name);返品名; } public void setName(string name){this.name = name; }}コントローラ:
Package org.elvin.boot.controller; Import org.elvin.boot.pojo.book; Import org.springframework.stereotype.controller; Import org.springframework.ui.ui.model; import org.springframework.web.bind.annotation.getmapping; org.springframework.web.bind.annotation.requestmapping;@controller@requestmapping( "first")public class firstcontroller {private string controllerpath = "first/"; @getMapping( "index")public string index(model model){system.out.println( "controller:firstController Index doin ..."); book book = new book(); book.setName( "Spring Boot"); model.addattribute( "book"、book); controllerpath + "index"を返します。 }}ビュー:
<!doctype html> <html lang = "en"> <head> <meta charset = "utf-8"/> <title> title </title> </head> <body> <h1 th: "$ {book.name}"> </h1> </body> </html>LocalHost:8080/First/Indexにアクセスすると、コンソールに応答情報が出力されます。
このようにして、単一のインターセプターの実行順序を見ることができます。
1.コントローラーメソッドが実行される前に実行されたプリハンドルメソッド
2。コントローラーアクションメソッドを実行します
3.アクションを実行した後、ビューを解析する前に(もしあれば)、インターセプターの触覚後の方法を実行します
4。ビューを分析します
5.解析後、後Afterpletionメソッドを実行します
複数のインターセプターが登録されている場合、実行順序は図に示されています。
2。インターセプターは許可の検証を実装します
同様に、最初に許可インターセプターを追加します
Package org.elvin.boot.interceptor; Import org.elvin.boot.annotation.nologin; import org.springframework.util.stringutils; import org.springframework.web.method.handlermethod; import org.springframework.web.handerinterceptor; org.springframework.web.servlet.modelandview; Import javax.servlet.httpservletrequest; Import javax.servlet.http.httpertresponse; Import javax.servlet.http.httssiss;公開クラスのlogineptoreptorseptors bo bolgenceptor prehandle(httpservletrequestリクエスト、httpservletresponse応答、オブジェクトハンドル)スロー例外{handlermethod method =(handlermethod)handle; class <? if(method.getMethodannotation(nologin.class)!= null || controllertype.getAnnotation(nologin.class)!= null){return true; } httpsession session = request.getSession(); string token =(string)session.getattribute( "token"); if(!stringutils.isempty(token)){return true; } respons.sendredirect( "/login/index"); falseを返します。 } @Override public void posthandle(httpservletrequest httpservletrequest、httpservletresponse httpservletresponse、object o、modelandview modelandview)exception {} @voverride public void afcompretion(httpservletredreate httpservletredretersevretersedenterspretesons httpservletResponse、オブジェクトO、例外e)例外{}}をスローする次に、許可インターセプターを登録します
Package.elvin.boot.interceptor; Import org.springframework.context.annotation.configuration; import org.springframework.web.servlet.config.annotation.interceptorregistristristry; Import org.springframework.web.servlet.config.annotation.notation.webmvcconfigureradapter class RegisterInterceptor拡張webmvcconfigureradapter {@override public void addInterceptors(interceptorregistry registry){registry.addInterceptor(new loginInterceptor()); Super.AddDINTERCEPTORS(レジストリ); }}ログインコントローラーをコントローラーに追加し、ログインページとログアウトメソッドを提供します
Package org.elvin.boot.controller; import org.elvin.boot.annotation.nologin; Import org.springframework.beans.actory.annotation.autowired; import org.stringframework.stereotype.controller; Import org.springframework.web.bind.annotation. org.springframework.web.bind.annotation.postmapping; import org.springframework.web.bind.annotation.requestmapping; Import org.springframework.web.bind.annotation.responsebody; Import javax.servlet.http.httpservletrequest; Import; javax.servlet.http.httpservletResponse; Import javax.servlet.http.httpsession;@nologin@controller@requestmapping( "login")public class logincontroller {@autowired private httpservletrequest request; @autowired private httpservletResponse応答。 private string controllerpath = "login/"; // @nologin @getmapping( "index")public string index(){httpsession session = request.getsession(); session.setattribute( "token"、 "token"); controllerpath + "index"を返します。 } // @nologin @postmapping( "checkout")@responsebody public string checkout(){httpsession session = request.getsession(); session.setattribute( "token"、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.targett; @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> </head> <body> <div> <input type = "button" Value = "id ="/< th:src = "@{/js/jquery-1.11.1.js}"> </script> <script th:inline = "javascript"> $(function(){$( "。container")。 {}、function(res){res == "ok") }); </script> </body> </html>結果デモンストレーション方法:
ブラウザでは、最初にhttp:// localhost:8080/login/indexページを開き、新しいタブでhttp:// localhost:8080/first/indexページにアクセスします。
First/Indexにアクセスすると、アクセスできることがわかります。
この時点で、ログイン/インデックスページでログアウトボタンをクリックし、最初の/インデックスページを更新すると、ログインページに直接ジャンプします。
上記の例String Bootとカスタムインターセプターの説明は、私があなたと共有するすべてのコンテンツです。参照を提供できることを願っています。wulin.comをもっとサポートできることを願っています。