SpringCloud Zuul 필터 반환 값 차단

6031 단어 SpringCloudZuul필터
Zuul 은 게 이 트 웨 이 서비스 로 서 다른 각 서비스 가 대외 중계 역 으로 Zuul 을 통 해 리 트 윗 을 요청 합 니 다.이것 은 일부 데이터 가 그대로 돌아 갈 수 없 는 것 과 관련된다.예 를 들 어 서비스 간 통신 의 증빙서류,사용자 의 암호 화 정보 등 이다.
예 를 들 어 사용자 서 비 스 는 로그 인 인 인 터 페 이 스 를 제공 합 니 다.사용자 이름 비밀번호 가 정확 한 후에 Token 으로 돌아 갑 니 다.이 Token 은 사용자 서비스의 통행증 으로서 사용자 가 로그 인 에 성공 한 후에 돌아 오 는 Token 은 암호 화 되 거나 변경 처 리 를 방지 해 야 합 니 다.사용자 서비스의 다른 인터페이스 에 도착 하기 전에 Token 을 검증 해 야 합 니 다.불법 Token 은 사용자 서비스 에 전송 하지 않 고 게 이 트 웨 이 층 에서 정 보 를 되 돌려 주면 됩 니 다.
서비스 가 되 돌아 오 는 정 보 를 수정 하려 면 Zuul 필 터 를 사용 해 야 합 니 다.사용 시 ZuulFilter 를 계승 해 필요 한 방법 을 실현 하면 된다.
Zuul 은 기본 적 인 네 가지 필터 형식 을 제공 하고 filter Type 방법 으로 표 지 를 합 니 다.
  • pre:경로 가 요청 되 기 전에 호출 할 수 있 습 니 다
  • route:경로 요청 시 호출 됨
  • post:route 와 error 필터 이후 호출 됨
  • error:요청 을 처리 하 는 중 오류 가 발생 했 을 때 호출 됨
  • 필터 가 실행 되 는 순 서 는 filter Order 방법 으로 정렬 되 며,작은 값 일수 록 우선 처리 합 니 다.FilterConstants 는 기본 필터 의 실행 순서 와 경로 유형 을 정의 합 니 다.대부분의 상수 가 여기에 있 습 니 다.
    예 를 들 어 로그 인 인터페이스 만 차단 해 야 하기 때문에 로그 인 요청(/user/login)만 차단 하면 됩 니 다.필터 의 shouldFilter 방법 을 통 해 차단 이 필요 한 지 여 부 를 판단 할 수 있 습 니 다.
    준 발 사용자 서비스 가 성공 한 후에 데이터 수정 이 이 루어 졌 기 때문에 차단기 의 유형 은 post 형식 입 니 다.전체 클래스 의 실현 은 다음 과 같다.
    
    public class AuthResponseFilter extends AbstractZuulFilter {
    
     private static final String RESPONSE_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 shouldFilter() {
      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 = StreamUtils.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());
         }
         String accessToken = authResult.getToken();
         result.put(tokenKey, accessToken);
        }
        body = gson.toJson(result);
       }
       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 과 token 으로 돌아 가 는 key 를 추가 합 니 다:
    system.config.authFilter.authUrl=/user/login
    system.config.authFilter.tokenKey=token
    context.setResponseBody(body);이 코드 는 핵심 입 니 다.이 방법 을 통 해 데 이 터 를 되 돌려 줍 니 다.
    사용자 가 로그 인 에 성공 하면 돌아 오 는 token 에 따라 권한 수여 서 비 스 를 통 해 token 암호 화 를 합 니 다.여기 서 암호 화 방식 은 JWT 를 사용 합 니 다.사용자 가 정 보 를 조작 하 는 것 을 방지 하고 불법 요 구 는 게 이 트 웨 이 층 에서 직접 차단 할 수 있다.
    Zuul 필터 의 실행 과정 에 대해 서 는 설명 이 필요 없습니다.원본 코드 를 보면 알 수 있 습 니 다.Zuul ServletFilter:
    
    @Override
     public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
      try {
       init((HttpServletRequest) servletRequest, (HttpServletResponse) servletResponse);
       try {
        preRouting();
       } catch (ZuulException e) {
        error(e);
        postRouting();
        return;
       }
    
       // Only forward onto to the chain if a zuul response is not being sent
       if (!RequestContext.getCurrentContext().sendZuulResponse()) {
        filterChain.doFilter(servletRequest, servletResponse);
        return;
       }
    
       try {
        routing();
       } catch (ZuulException e) {
        error(e);
        postRouting();
        return;
       }
       try {
        postRouting();
       } catch (ZuulException e) {
        error(e);
        return;
       }
      } catch (Throwable e) {
       error(new ZuulException(e, 500, "UNCAUGHT_EXCEPTION_FROM_FILTER_" + e.getClass().getName()));
      } finally {
       RequestContext.getCurrentContext().unset();
      }
     }
    방법 설명:
  • preRoute:pre 형식의 필 터 를 실행 합 니 다
  • postRoute:post 형식의 필 터 를 실행 합 니 다
  • route:route 형식의 필 터 를 실행 합 니 다
  • error:error 형식의 필 터 를 실행 합 니 다
  • context.setSendZuulResponse(false)를 통 해 요청 한 퍼 가기 를 중지 할 수 있 지만 pre 형식의 필터 에 만 설정 할 수 있 습 니 다.
    필 터 를 종료 하 는 방법:
    pre 형식의 필터 만 퍼 가기 종 료 를 지원 합 니 다.다른 필 터 는 순서대로 실 행 됩 니 다.또한 pre 형식의 필터 도 모든 pre 필터 가 실 행 된 후에 만 퍼 가기 종 료 를 할 수 있 습 니 다.필터 가 계속 실 행 될 수 없습니다.ZuulServletFilter 소스 코드 보기:
    
      // Only forward onto to the chain if a zuul response is not being sent
       if (!RequestContext.getCurrentContext().sendZuulResponse()) {
        filterChain.doFilter(servletRequest, servletResponse);
        return;
       }
    본 논문 의 코드 는 이미 제출 되 었 습 니 다.https://gitee.com/cmlbeliever/springcloud환영 Star
    구현 클래스:api-getway 프로젝트 의 com.cml.springcloud.api.filter.authResponseFilter
    로 컬 주소:http://xz.jb51.net:81/201806/yuanma/cmlbeliever-springcloud_jb51.rar
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기