게이트웨이 서비스로서 Zuul은 다른 서비스를위한 외부 대중 교통 방송국이며 Zuul을 통해 요청이 전달됩니다. 여기에는 서비스 간의 커뮤니케이션, 사용자 암호화 정보 등과 같은 일부 데이터를 손상되지 않아도됩니다.
예를 들어, 사용자 서비스는 로그인 인터페이스를 제공합니다. 사용자 이름과 암호가 올바른 후에 토큰이 반환됩니다. 이 토큰은 사용자 서비스에 대한 패스로 사용됩니다. 그런 다음 사용자가 성공적으로 로그인 한 후 토큰이 반환되면 암호화되거나 변조를 방지해야합니다. 사용자 서비스의 다른 인터페이스에 도착하기 전에 토큰을 확인해야합니다. 불법 토큰을 사용자 서비스로 전달할 필요가 없으며 정보는 게이트웨이 계층에서 직접 반환 할 수 있습니다.
서비스가 반환 한 정보를 수정하려면 Zuul의 필터를 사용해야합니다. 그것을 사용할 때는 Zuulfilter를 상속하고 필요한 방법 만 구현하면됩니다.
Zuul은 FilterType 메소드로 식별되는 기본 4 가지 필터 유형을 제공합니다.
필터가 실행되는 순서는 Filterorder 방법으로 정렬되고 값이 작을수록 선호됩니다. FilterConstants는 기본 필터의 일부 열의 실행 순서 및 라우팅 유형을 정의하며, 대부분의 상수가 여기에 있습니다.
예제에서 볼 수 있듯이 로그인 인터페이스 만 인터셉트해야하므로 로그인 요청 (/사용자/로그인) 만 필요합니다. 필터의 필터 필터 방법을 사용하여 가로 채기가 필요한지 여부를 결정할 수 있습니다.
사용자 서비스가 성공한 후에 데이터 수정이 이루어 지므로 인터셉터 유형은 게시 유형입니다. 전체 클래스의 구현은 다음과 같습니다.
Public Class AuthResponseFilter 확장 AbstractZuulfilter {private static final String response_key_token = "Token"; @Value ( "$ {system.config.authfilter.authurl}") 개인 문자열 authurl; @Value ( "$ {system.config.authfilter.tokenkey}") private String tokenkey = response_key_token; @autowired private authapi authapi; @override public boolean rittfilter () {requestContext context = getCurrentContext (); return StringUtils.equals (context.getRequest (). getRequesturi (). toString (), authurl); } @override public object run () {try {requestContext context = getCurrentContext (); inputStream stream = context.getResponsedAtastream (); 문자열 body = streamutils.copytostring (stream, charset.forname ( "utf-8")); if (stringUtils.isnotblank (body)) {gson gson = new Gson (); @SuppressWarnings ( "선택 취소")지도 <문자열, 문자열> 결과 = 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 new OregalArgumentException (authresult.geterRmsg ()); } 문자열 accessToken = authresult.getToken (); result.put (Tokenkey, AccessToken); } body = gson.tojson (결과); } context.setResponseBody (Body); } catch (ioexception e) {rethrowruntimeexception (e); } return 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 =/사용자/로그인
System.config.authfilter.tokenkey = 토큰
Context.SetResponseBody (Body); 이 코드는 핵심이며 반환 된 데이터는이 방법을 통해 수정됩니다.
사용자가 성공적으로 로그인하면 반환 된 토큰을 기반으로 공인 서비스를 통해 토큰 암호화가 수행됩니다. 여기서 암호화 방법은 JWT를 사용합니다. 사용자가 정보를 조작하지 못하도록하기 위해 게이트웨이 계층에서 불법 요청을 직접 가로 채울 수 있습니다.
Zuul 필터의 실행 프로세스와 관련하여 여기에서 설명 할 필요가 없습니다. 소스 코드를 한눈에 알 수 있습니다. zuulservletfilter :
@override public void dofilter (servletrequest servletrequest, servletresponse servletresponse, filterchain filterchain)는 ioexception, servletexception {try {init ((httpservletrequest) servletrequest, (httpservletResponse) servletResponse); {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)를 통해 종료 될 수 있지만 사전 유형 필터에서만 설정할 수 있습니다.
필터 종료 방법에 대해 :
사전 유형 필터 만 지원 종료 전달을 지원하고 기타 필터는 순서대로 실행됩니다. 또한, 사전 유형 필터는 모든 프리 형 필터가 실행 된 후에 만 전달을 종료 할 수 있습니다. 필터를 종료하고 계속 실행할 수 없습니다. ZuulservletFilter 소스 코드를보십시오.
// ZUUL 응답이 전송되지 않는 경우 (! requestContext.GetCurrentContext (). SendZuulResponse ()) {Filterchain.dofilter (ServletRequest, ServletResponse); 반품; } 이 기사의 코드는 https://gitee.com/cmlbeliev/springcloud에 제출되었습니다.
Com.cml.springcloud.api.filter.authrepronsefilter에서 클래스 구현
로컬 주소 : http://xz.vevb.com:81/201806/yuanma/cmmlbeliev-springcloud_jb51.rar
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.