ゲートウェイサービスとして、Zuulは他のサービスの外部トランジットステーションであり、リクエストはZuulを通じて転送されます。これには、サービス、ユーザー暗号化情報などの通信の資格情報など、一部のデータをそのまま返すことはできません。
たとえば、ユーザーサービスはログインインターフェイスを提供します。ユーザー名とパスワードが正しい後、トークンが返されます。このトークンは、ユーザーサービスへのパスとして使用されます。次に、ユーザーが正常にログインした後にトークンが返され、暗号化または改ざんを防ぐ必要があります。ユーザーサービスの他のインターフェイスに到着する前に、トークンを検証する必要があります。違法なトークンはユーザーサービスに転送する必要はなく、情報をゲートウェイレイヤーに直接返すことができます。
サービスによって返される情報を変更するには、Zuulのフィルターを使用する必要があります。それを使用する場合、ZuFilterを継承して必要な方法を実装する必要があります。
Zuulは、FilterTypeメソッドによって識別されるデフォルトの4つのフィルタータイプを提供します。
フィルターが実行される順序は、filterorderメソッドによってソートされ、値が小さいほど、それが好まれます。 FilterConstantsは、デフォルトフィルターのいくつかの列の実行順序とルーティングタイプを定義し、使用する必要がある定数のほとんどがここにあります。
例に示すように、ログインインターフェイスのみを傍受する必要があるため、ログイン要求(/user/ログイン)のみが必要です。フィルターのSefsFilterメソッドを使用して、傍受が必要かどうかを判断できます。
ユーザーサービスが成功した後にデータの変更が行われるため、インターセプタータイプはポストタイプです。クラス全体の実装は次のとおりです。
public class authResponseFilter extends abstractZuflilter {private static final string response_key_key_token = "token"; @value( "$ {system.config.authfilter.authurl}")private string authurl; @value( "$ {system.config.authfilter.tokenkey}")private string tokenkey = response_key_token; @autowired private authapi authapi; @Override public boolean sefsfilter(){requestContext Context = getCurrentContext(); return stringutils.equals(context.getRequest()。getRequesturi()。toString()、authurl); } @Override public object run(){try {requestContext Context = getCurrentContext(); inputstream stream = context.getResponsedAtaStream(); string body = rirechutils.copytostring(stream、charset.forname( "utf-8")); if(stringutils.isnotblank(body)){gson gson = new gson(); @suppresswarnings( "Unchecked")Map <String、String> result = gson.fromjson(body、map.class); if(stringutils.isnotblank(result.get(tokenkey))){authmodel authresult = authapi.encodetoken(result.get(tokenkey)); if(authresult.getStatus()!= httpservletresponse.sc_ok){throw new IllegalArgumentException(authResult.getErrmsg()); }文字列AccessToken = authResult.getToken(); result.put(tokenkey、accesstoken); } body = gson.tojson(result); } context.setResponseBody(body); } catch(ioexception e){rethrowruntimeexception(e); } nullを返します。 } @Override public String filterType(){return filterConstants.post_type; } @Override public int filterorder(){return filterconstants.send_response_filter_order -2; }}構成ファイルで、承認URLを追加し、キートークンを返します。
System.config.authfilter.authurl =/user/login
System.config.authfilter.tokenkey = token
context.setResponseBody(body);このコードはコアであり、返されたデータはこの方法で変更されます。
ユーザーが正常にログインすると、トークン暗号化は、返されたトークンに基づいた承認されたサービスを通じて実行されます。ここの暗号化方法はJWTを使用しています。ユーザーが情報を改ざんしないようにするために、違法な要求をゲートウェイレイヤーで直接傍受することができます。
Zuulフィルターの実行プロセスについては、ここで説明する必要はありません。ソースコードを一目で伝えることができます。 Zuulservletfilter:
@Override public void dofilter(servletRequest servletRequest、servletResponse servletResponse、filterchain filterchain)IoException、servletexception {init((httpservletrequest)servletrequest、(httpservletresponse)servletresponse); try {prerouting(); } catch(zuulexception e){error(e); postrouting();戻る; } // Zuul応答が送信されていない場合のみチェーンに転送する場合のみ(!requestContext.getCurrentContext()。sendzuulresponse()){filterchain.dofilter(servletrequest、servletresponse);戻る; } try {routing(); } catch(zuulexception e){error(e); postrouting();戻る; } try {postrouting(); } catch(zuulexception e){error(new zuulexception(e、500、 "uncaught_exception_from_filter_" + e.getClass()。getName())); }最後に{requestContext.getCurrentContext()。unset(); }}メソッド説明:
要求された転送は、Context.setsendzuulResponse(false)を介して終了できますが、Pre-Typeフィルターでのみ設定できます。
フィルターを終了する方法について:
プリタイプのフィルターのみが終了の転送をサポートし、他のフィルターが順番に実行されます。さらに、Pre-Typeフィルターは、すべてのプレタイプフィルターが実行された後にのみ転送を終了できます。フィルターを終了して実行することはできません。 Zuulservletfilterソースコードをご覧ください。
// Zuul応答が送信されていない場合のみチェーンに転送する場合のみ(!requestContext.getCurrentContext()。sendzuulResponse()){filterchain.dofilter(servletRequest、servletResponse);戻る; }この記事のコードは、https://gitee.com/cmlbeliev/springcloudへようこそ
クラスの実装:com.cml.springcloud.api.filter.authresponsefilter Api-Getwayプロジェクトの下で
ローカルアドレス:http://xz.vevb.com:81/201806/yuanma/cmmlbeliev-springcloud_jb51.rar
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。