JAVA HTTP 역방향 에이전트 구현 과정 상세 설명
쉽게 말 하면 역방향 프 록 시 서버 는 요청 을 받 지만 그 자체 가 이 요청 을 처리 하지 않 고 요청 을 처리 합 니 다.예 를 들 어 로그,캐 시,인증 등 서 비 스 를 추가 한 다음 에 해당 하 는 응용 서버 에 전송 하여 처리 한 다음 에 처리 결 과 를 되 돌려 줍 니 다.
나의 현재 수 요 는 A 응용 프로그램 이 B 응용 프로그램의 보고서 페이지 에 방문 해 야 하고 B 응용 프로그램 은 소스 코드 가 없 으 며 B 응용 프로그램의 로그 인 권한 을 자동 으로 처리 해 야 한 다 는 것 이다.사용자 의 중복 로그 인 을 피하 다.
1.관련 의존 도입
<dependency>
<groupId>org.mitre.dsmiley.httpproxy</groupId>
<artifactId>smiley-http-proxy-servlet</artifactId>
<version>1.11</version>
</dependency>
이 jar 가방 은 두 가지 종류 만 있 습 니 다.그 중에서 핵심 은 Proxy Servlet 입 니 다.저 자 는 HttpServlet 에 관 한 방법 을 다시 썼 다.그 는 새로운 request 를 proxy Request 로 복사 했다.
그리고 주소 와 관련 속성 을 바 꾸 고 HttpClient 를 사용 하여 proxy Request 를 보 냅 니 다.
그리고 받 은 proxy Response 의 내용 을 HttpResponse 에 복사 합 니 다.
중계 역 에 해당 하 다.구체 적 으로 소스 코드 를 보 세 요.
https://github.com/mitre/HTTP-Proxy-Servlet
2.spring 사용:
2.1 application.yml 프 록 시 매개 변수 설정 추가
#
proxy:
servlet_url: /webappB/*
target_url: https://webappB_HOST_IP:8001/webappB demo
# servlet_url: /proxybaidu/*
# target_url: https://www.baidu.com
여기에 현묘 한 계책 이 있다.왜 원본 url 과 목표 url 루트 경로 가 일치 합 니까?
이것 은:targeturl 페이지 에는 텍스트 뿐만 아니 라 다른 자원 의 호출 도 있 습 니 다.예 를 들 어 그림,예 를 들 어 안의 js 는 다른 url 을 호출 했 습 니 다.
이렇게 되면 target 페이지 의 한 그림 의 url 이 상대 경로 img/test.jpg 라면;
페이지 에 있 는/webappc/image/test.jpg;이렇게 host 가 바 뀌 면 그림 주 소 를 찾 을 수 없습니다.
물론 proxy Servlet 의 원본 코드 를 바 꾸 어 정확 한 url 주소 로 바 꿀 수도 있 습 니 다.원본 코드 를 바 꾸 고 싶 지 않다 면 일치 하 는 것 이 좋 습 니 다.귀 찮 게 하지 마.
2.2 등록 servlet.
@Configuration
public class ProxyServletConfiguration {
/**
*
*/
@Value("${proxy.servlet_url}")
private String servlet_url;
/**
*
*/
@Value("${proxy.target_url}")
private String target_url;
@Bean
public Servlet createProxyServlet() {
/** ProxyServlet */
return new ProxyServlet();
}
@Bean
public ServletRegistrationBean proxyServletRegistration() {
ServletRegistrationBean registrationBean = new ServletRegistrationBean(createProxyServlet(), servlet_url);
//
Map<String, String> params = ImmutableMap.of("targetUri", target_url, "log", "true");
registrationBean.setInitParameters(params);
return registrationBean;
}
}
2,3 테스트.ok.localhost:8080/proxybaidu/
2.4.물론 당신 도 클래스 를 다시 쓸 수 있 습 니 다.MyProxyServlet 은 ProxyServlet 을 계승 할 수 있 습 니 다.
다시 그 중의 execute 방법.관련 기능 을 추가 하 다.로그,로그 인 권한 등.
@Override
protected HttpResponse (HttpServletRequest servletRequest, HttpServletResponse servletResponse,
HttpRequest proxyRequest) throws IOException { // header
proxyRequest.setHeader("Authorization", "Basic " + getWebappBLoginAuth());
HttpResponse response = super.doExecute(servletRequest, servletResponse, proxyRequest);
// , 。
// String origin = servletRequest.getHeader("origin");
// response.setHeader("Access-Control-Allow-Origin", origin);
// response.setHeader("Access-Control-Allow-Credentials", "true");
// response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
// response.setHeader("Access-Control-Allow-Headers",
// "Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin" +
// ",User-Agent,X-Mx-ReqToken,X-Requested-With");
return response;
}
후기이 프 록 시 서 블 릿 은 nginx 가 기본 기능 을 보 는 것 과 마찬가지 로 대리 역 을 할 수 있 습 니 다.
하지만 확장 기능 과 IO 성능 은 nginx 와 비교 할 수 없 을 것 입 니 다.근 데 이 건 자바 언어 로 쓴 거 예요.
2 차 개발 에 편리 하 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JAVA 객체 작성 및 제거 방법정적 공장 방법 정적 공장 방법의 장점 를 반환할 수 있습니다. 정적 공장 방법의 단점 류 공유되거나 보호된 구조기를 포함하지 않으면 이불류화할 수 없음 여러 개의 구조기 파라미터를 만났을 때 구축기를 고려해야 한다...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.