SpringCloud Zuul 필터 반환 값 차단
예 를 들 어 사용자 서 비 스 는 로그 인 인 인 터 페 이 스 를 제공 합 니 다.사용자 이름 비밀번호 가 정확 한 후에 Token 으로 돌아 갑 니 다.이 Token 은 사용자 서비스의 통행증 으로서 사용자 가 로그 인 에 성공 한 후에 돌아 오 는 Token 은 암호 화 되 거나 변경 처 리 를 방지 해 야 합 니 다.사용자 서비스의 다른 인터페이스 에 도착 하기 전에 Token 을 검증 해 야 합 니 다.불법 Token 은 사용자 서비스 에 전송 하지 않 고 게 이 트 웨 이 층 에서 정 보 를 되 돌려 주면 됩 니 다.
서비스 가 되 돌아 오 는 정 보 를 수정 하려 면 Zuul 필 터 를 사용 해 야 합 니 다.사용 시 ZuulFilter 를 계승 해 필요 한 방법 을 실현 하면 된다.
Zuul 은 기본 적 인 네 가지 필터 형식 을 제공 하고 filter Type 방법 으로 표 지 를 합 니 다.
예 를 들 어 로그 인 인터페이스 만 차단 해 야 하기 때문에 로그 인 요청(/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();
}
}
방법 설명:필 터 를 종료 하 는 방법:
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
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[MeU] Hashtag 기능 개발➡️ 기존 Tag 테이블에 존재하지 않는 해시태그라면 Tag , tagPostMapping 테이블에 모두 추가 ➡️ 기존에 존재하는 해시태그라면, tagPostMapping 테이블에만 추가 이후에 개발할 태그 기반 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.