前の例では、Zuulを使用してGateway //www.vevb.com/article/133235.htmを構築しました
ここでは、ゲートウェイの役割について詳しく説明しません。今日の私たちの焦点はZuulのフィルターです。フィルターを介して、セキュリティ制御を実装できます。たとえば、リクエストパラメーターにユーザー名とパスワードを持つクライアントのみがサーバーのリソースにアクセスできます。では、フィルターを実装する方法は?
フィルターを実装するには、次の手順が必要です。
1。Zuflilterクラスを継承します。フィルターの特性を確認するために、ここで3つのフィルターを作成します。
ユーザー名でフィルター
パッケージcom.chhliu.springcloud.zuul; javax.servlet.http.httpservletrequestをインポートします。 com.netflix.zuul.zulfilterをインポートします。 com.netflix.zuul.context.requestContextをインポートします。 public class accessUsernameFilter拡張zulfilter {@override public object run(){requestContext ctx = requestContext.getCurrentContext(); httpservletrequest request = ctx.getRequest(); system.out.println(string.format( "%s AccessUsernameFilter request to%s"、request.getMethod()、request.getRequesturl()。toString())); string username = request.getParameter( "username"); //要求されたパラメーターを取得するif(null!= username && username.equals( "chhliu")){//要求されたパラメーターが空でなく、chhliuの場合、ctx.setsendzuulresponse(true); ctx.set( "Issuccess"、true); //値を設定して、次のフィルターに以前のフィルター戻りnullのステータスを確認させます。 } else {ctx.setsendzuulResponse(false); //リクエストをフィルタリングし、ctx.setresponsestatuscode(401); //エラーコードctx.setresponsebody( "{/" result/":/" usernameは正しい!/"}); nullを返します。 }} @Override public boolean sefsfilter(){return true; //フィルターを実行するかどうか、ここでは真実であるかどうか、フィルタリングが必要であることを示します} @Override public int filterOrder(){return 0; //優先度は0です。 Zuflilterを継承し、上記の4つのメソッドを上書きすることにより、簡単なフィルターを実装できます。以下は、関連する注意点の説明です。
FilterType:フィルターのタイプを表す文字列を返します。次のように、Zuulでは、ライフサイクルが異なる4つのフィルタータイプが定義されています。
Zuulのメインリクエストライフサイクルには、「Pre」、「Route」、「Post」などのステージが含まれます。要求ごとに、これらのタイプのすべてのフィルターが実行されます。
filterorder:int値を介してフィルターの実行順序を定義します
sufffilter:ブール型のタイプを返して、フィルターを実行するかどうかを判断するため、この関数はフィルターのスイッチを実装できます。上記の例では、直接trueを返すため、フィルターは常に有効になります
実行:フィルターの特定のロジック。ここでは、ctx.setsendzuulResponse(false)を使用して要求をフィルタリングし、それをルーティングしないでください。その後、ctx.setresponsestatuscode(401)を介して返されるエラーコードを設定しないことに注意してください。
フィルター間の調整
フィルターが互いにアクセスする直接的な方法はありません。 RequestContextを使用して状態を共有できます。これは、Zuulと見なされるプリミティブの明示的なアクセサの方法を備えた地図のような構造です。それらは、threadlocalを使用して内部的に実装されています。興味のある学生はソースコードを確認できます。
パスワードに従って別のフィルターとフィルターを作成します。
パッケージcom.chhliu.springcloud.zuul; javax.servlet.http.httpservletrequestをインポートします。 com.netflix.zuul.zulfilterをインポートします。 com.netflix.zuul.context.requestContextをインポートします。 public class AccessPassWordFilter拡張zulFilter {@Override public object run(){requestContext ctx = requestContext.getCurrentContext(); httpservletrequest request = ctx.getRequest(); system.out.println(string.format( "%s AccessPassWordFilter request to%s"、request.getMethod()、request.getRequesturl()。toString()));文字列username = request.getParameter( "password"); if(null!= username && username.equals( "123456")){ctx.setsendzuulresponse(true); ctx.setresponsestatuscode(200); ctx.set( "Issuccess"、true); nullを返します。 } else {ctx.setsendzuulResponse(false); ctx.setresponsestatuscode(401); ctx.setResponseBody( "{/" result/":/"パスワードは正しくありません!/"}"); ctx.set( "Issuccess"、false); nullを返します。 }} @Override public boolean sefsfilter(){requestContext ctx = requestContext.getCurrentContext(); return(boolean)ctx.get( "issuccess"); //前のフィルターの結果が真である場合、以前のフィルターが成功し、現在のフィルターに入る必要があることを意味します。前のフィルターの結果が偽の場合、それは以前のフィルターが成功していないことを意味します。次のフィルタリングアクションを実行する必要はありません。後続のすべてのフィルターをスキップして結果を返します} @Override public int filterOrder(){return 1; //優先度設定1} @Override public String filterType(){return "pre"; }}最後にポストフィルターを作成します
パッケージcom.chhliu.springcloud.zuul; javax.servlet.http.httpservletrequestをインポートします。 com.netflix.zuul.zulfilterをインポートします。 com.netflix.zuul.context.requestContextをインポートします。パブリッククラスAccessTokenFilter拡張zulFilter {@Override public object run(){requestContext ctx = requestContext.getCurrentContext(); httpservletrequest request = ctx.getRequest(); system.out.println(string.format( "%s AccessTokenFilter request to%s"、request.getMethod()、request.getRequesturl()。toString())); ctx.setsendzuulResponse(true); ctx.setresponsestatuscode(200); ctx.setResponseBody( "{/" name/":/" chhliu/"}"); //最終結果を出力しますnull; } @Override public boolean sefsfilter(){return true; } @Override public int filterOrder(){return 0; } @Override public String filterType(){return "post"; //リクエストが処理された後、フィルターが入力されます}}} 2。メインクラスでは、最初に最初の2つのフィルターをオンにします
@bean public AccessUsernameFilter AccessUserNameFilter(){return new AccessUserNameFilter(); } @bean public AccessPassWordFilter AccessPassWordFilter(){return new AccessPassWordFilter(); } 3.リクエストを入力して確認します
(1)リクエストは:http:// localhost:8768/h2service/user/1?username = chhliuです
テスト結果は次のとおりです。{"result": "パスワードは正しくありません!"}
コンソール印刷結果
http:// localhost:8768/h2service/user/1へのアクセスUsernameFilterリクエストを取得します
http:// localhost:8768/h2service/user/1にアクセスしてください
AccesspassWordFilterフィルターの確認時にassidusunmamefilterフィルターを渡しました
バックグラウンドにSQL印刷はありません。つまり、リクエストがルーティングされていないことを意味します
(2)リクエストは:http:// localhost:8768/h2service/user/1?パスワード= 123456です
テスト結果は次のとおりです。{"result": "ユーザー名は正しくありません!"}
コンソール印刷結果:
http:// localhost:8768/h2service/user/1へのアクセスUsernameFilterリクエストを取得します
これは、AccessUsNameFilterフィルターに到達したことを意味しますが、AccessPassWordFilterフィルターに到達していません。 AccessUsNameFilterフィルターの優先度が高いため、最初に実行されます。実行すると、フィルター条件が満たされないため、その後すべてのフィルターがスキップされ、バックグラウンドでSQL印刷なしで結果が返され、リクエストがルーティングされていないことがわかります。
(3)リクエストはhttp:// localhost:8768/h2service/user/1?password = 123456&username = chhliuです
テスト結果は次のとおりです。
{
「id」:1、
「ユーザー名」:「user1」、
「名前」:「Zhang San」、
「年齢」:20、
「バランス」:100.00
}
コンソール印刷の結果:
http:// localhost:8768/h2service/user/1へのアクセスUsernameFilterリクエストを取得します
http:// localhost:8768/h2service/user/1にアクセスしてください
これは、AccessUsNameFilterが最初に実行され、AccessPassWordFilterが実行されることを意味します。これは、前述の順序値が小さくなるほど、優先度が高くなります。
同時に要求されたサービスには、SQL出力があります。
hibernate:select user0.idはid1_0_0_、user0.age as age2_0_0_、user0.balance as balance3_0_0_、name4_0_0_、user0_.username as username5_0_0_ as user0_where0_.id = as username5_0_0_
リクエストがルーティングされたことを示します。
4。ポストフィルターをオンにして再度実行します
テスト結果:ポストフィルターは最後に実行されることがわかりましたが、その優先順位は0です
Zuulのフィルターのライフサイクルについては、以下の図を参照してください
注:上の写真には小さなエラーがあります。ルーティングはルートでなければなりません
5。展開します
Zuulは、特別なタイプのフィルターも提供します。
staticResponseFilter:staticResponseFilterは、リクエストをソースに転送するのではなく、Zuul自体からの応答を生成できます。
SurgicalDebugFilter:SurgicalDebugFilterを使用すると、特定のリクエストを区切りデバッグクラスターまたはホストにルーティングできます。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。