이전 예에서는 Zuul을 사용하여 게이트웨이 //www.vevb.com/article/133235.htm을 만들었습니다.
여기에서 게이트웨이의 역할에 대한 자세한 내용은 설명하지 않을 것입니다. 오늘 우리의 초점은 Zuul의 필터입니다. 필터를 통해 보안 제어를 구현할 수 있습니다. 예를 들어 요청 매개 변수에 사용자 이름과 비밀번호가있는 클라이언트 만 서버의 리소스에 액세스 할 수 있습니다. 그렇다면 필터를 구현하는 방법?
필터를 구현하려면 다음 단계가 필요합니다.
1. Zuulfilter 클래스를 물려 받으십시오. 필터의 특성을 확인하기 위해 여기에서 3 개의 필터를 만듭니다.
사용자 이름별로 필터
패키지 com.chhliu.springcloud.zuul; import javax.servlet.http.httpservletrequest; com.netflix.zuul.zuulfilter import; com.netflix.zuul.context.requestContext 가져 오기; 공개 클래스 accessUserNameFilter 확장 zuulfilter {@override public object run () {requestContext ctx = requestContext.getCurrentContext (); httpservletrequest 요청 = ctx.getRequest (); System.out.println (String.format ( " %s AccessUserNameFilter request to %s", request.getMethod (), request.getRequestUrl (). toString ())); String username = request.getParameter ( "username"); // 요청 된 매개 변수를 가져옵니다. ctx.set ( "issuccess", true); // 다음 필터가 이전 필터 리턴 null의 상태를 볼 수 있도록 값을 설정합니다. } else {ctx.setsendzuulresponse (false); // 요청을 필터링하고 ctx.setResponsestatusCode (401); // 오류 코드 ctx.setResponseBody ( "{/"result/":/"username이 맞지 않습니다!/"}"); ") 널 리턴; }} @override public boolean ritefilter () {return true; // 필터를 실행 해야하는지, 필터링이 필요하다는 것을 나타냅니다.} @override public int filterorder () {return 0; // 우선 순위는 0이고, 숫자가 클수록 우선 순위가 낮을수록 {return}} {// prefilter "} {// prefilter" Zuulfilter를 상속하고 위의 4 가지 방법을 덮어 쓰면 간단한 필터를 구현할 수 있습니다. 다음은 관련주의 지점에 대한 설명입니다.
FilterType : 필터 유형을 나타내는 문자열을 반환합니다. 수명주기가 다른 4 개의 필터 유형은 다음과 같이 Zuul에서 정의됩니다.
Zuul의 주요 요청 수명주기에는 "Pre", "Route"및 "Post"와 같은 단계가 포함됩니다. 각 요청에 대해 이러한 유형이있는 모든 필터가 실행됩니다.
FilterOrder : int 값을 통해 필터의 실행 순서를 정의합니다.
DistFilter : 부울 유형을 반환하여 필터를 실행할지 여부를 결정 하므로이 기능은 필터의 스위치를 구현할 수 있습니다. 위의 예에서는 직접 true를 반환하므로 필터는 항상 적용됩니다.
실행 : 필터의 특정 논리. 여기서 우리는 ctx.setsendzuulresponse (false)를 사용하여 요청을 필터링 한 다음 ctx.setResponsestatuscode (401)를 통해 반환되는 오류 코드를 설정합니다.
필터 간의 조정
필터가 서로 액세스 할 수있는 직접적인 방법은 없습니다. requestContext를 사용하여 상태를 공유 할 수 있습니다. State는 Zuul로 간주되는 프리미티브에 대한 명시 적 액세서 방법을 갖춘 맵과 같은 구조입니다. 그들은 ThreadLocal을 사용하여 내부적으로 구현됩니다. 관심있는 학생들은 소스 코드를 확인할 수 있습니다.
비밀번호에 따라 다른 필터를 만들고 필터를 작성하십시오.
패키지 com.chhliu.springcloud.zuul; import javax.servlet.http.httpservletrequest; com.netflix.zuul.zuulfilter import; com.netflix.zuul.context.requestContext 가져 오기; 공개 클래스 AccessPasswordFilter 확장 Zuulfilter {@override public object run () {requestContext ctx = requestContext.getCurrentContext (); httpservletrequest 요청 = 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); 널 리턴; } else {ctx.setsendzuulresponse (false); ctx.setResponsestatusCode (401); ctx.setResponseBody ( "{/"result/":/"password는 정확하지 않습니다!/"}"); ctx.set ( "issuccess", false); 널 리턴; }} @override public boolean roompilter () {requestContext ctx = requestContext.GetCurrentContext (); return (boolean) ctx.get ( "issuccess"); // 이전 필터의 결과가 사실이라면 이전 필터가 성공했으며 현재 필터를 입력해야 함을 의미합니다. 이전 필터의 결과가 False 인 경우 이전 필터가 성공하지 못했음을 의미합니다. 다음 필터링 동작을 수행 할 필요가 없습니다. 모든 후속 필터를 건너 뛰고 결과를 반환} @override public int filterorder () {return 1; // 우선 순위 1} @Override public String filterType () {return "pre"; }} 끝에 포스트 필터를 만듭니다
패키지 com.chhliu.springcloud.zuul; import javax.servlet.http.httpservletrequest; com.netflix.zuul.zuulfilter import; com.netflix.zuul.context.requestContext 가져 오기; 공개 클래스 AccessTokenFilter 확장 Zuulfilter {@override public object run () {requestContext ctx = requestContext.getCurrentContext (); httpservletrequest 요청 = 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/"}"); // 최종 결과를 return null; } @override public boolean routfilter () {return true; } @override public int filterorder () {return 0; } @override public String filterType () {return "post"; // 요청이 처리 된 후 필터가 입력됩니다}} 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입니다
테스트 결과는 다음과 같습니다. { "결과": "비밀번호는 정확하지 않습니다!"}
콘솔 인쇄 결과
http : // localhost : 8768/h2service/user/1에 AccessUserNameFilter 요청을 받으십시오
http : // localhost : 8768/h2service/user/1에 AccessPasswordFilter 요청을 받으십시오
AccessUserNameFilter 필터를 통과하여 AccessPasswordFilter 필터를 확인할 때 실패했습니다
백그라운드에는 SQL 인쇄가 없으므로 요청이 라우팅되지 않음을 의미합니다.
(2) 요청은 다음과 같습니다. http : // localhost : 8768/h2service/user/1? password = 123456
테스트 결과는 다음과 같습니다. { "결과": "사용자 이름은 정확하지 않습니다!"}
콘솔 인쇄 결과 :
http : // localhost : 8768/h2service/user/1에 AccessUserNameFilter 요청을 받으십시오
이는 AccessUserNameFilter 필터에 도달했지만 AccessPasswordFilter 필터에 도달하지 않았 음을 의미합니다. accessUserNameFilter 필터의 우선 순위가 높기 때문에 먼저 실행됩니다. 실행할 때 필터 조건이 충족되지 않으므로 나중에 모든 필터가 건너 뜁니다. 결과는 백그라운드에서 SQL 인쇄없이 반환되어 요청이 라우팅되지 않았 음을 나타냅니다.
(3) 요청은 http : // localhost : 8768/h2service/user/1? password = 123456 & username = chhliu입니다
테스트 결과는 다음과 같습니다.
{
"ID": 1,
"사용자 이름": "user1",
"이름": "장 산",
"나이": 20,
"균형": 100.00
}
콘솔 인쇄 결과 :
http : // localhost : 8768/h2service/user/1에 AccessUserNameFilter 요청을 받으십시오
http : // localhost : 8768/h2service/user/1에 AccessPasswordFilter 요청을 받으십시오
이는 AccessUserNameFilter가 먼저 실행 된 다음 AccessPasswordFilter가 실행되었음을 의미합니다. 이것은 앞에서 언급 한 순서 값이 작을수록 우선 순위가 높아집니다.
동시에 요청 된 서비스에는 SQL 출력이 있습니다.
Hibernate : id1_0_0_, user0_.age as age2_0_0_, user0_.balance as balan
요청이 라우팅되었음을 나타냅니다.
4. 포스트 필터를 켜고 다시 실행하십시오.
테스트 결과 : 우선 순위는 0이지만 포스트 필터는 마지막으로 실행 된 것으로 밝혀졌습니다.
Zuul 필터의 수명주기와 관련하여 아래 그림을 참조하십시오.
참고 : 위 그림에는 작은 오류가 있으므로 라우팅은 경로이어야합니다.
5. 확장
Zuul은 또한 특수 유형의 필터, 즉 STATICRESPONSEFILTER 및 SURMERDEBUGFILTER를 제공합니다.
staticResponseFilter : staticResponseFilter는 요청을 소스에 전달하는 대신 Zuul 자체의 응답 생성을 허용합니다.
SurgicalDebugFilter : SurgicalDebugFilter를 사용하면 구분 된 디버그 클러스터 또는 호스트에 특정 요청을 라우팅 할 수 있습니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.