JAVA HTTP 역방향 에이전트 구현 과정 상세 설명

리 버스 프 록 시(Reverse Proxy)방식 은 프 록 시 서버 로 인터넷 의 연결 요청 을 받 은 다음 내부 네트워크 에 있 는 서버 에 전송 을 요청 하고 서버 에서 얻 은 결 과 를 인터넷 에서 연결 을 요청 하 는 클 라 이언 트 에 게 되 돌려 주 는 것 을 말한다.이때 프 록 시 서버 는 대외 적 으로 리 버스 프 록 시 서버 로 나타난다.
 쉽게 말 하면 역방향 프 록 시 서버 는 요청 을 받 지만 그 자체 가 이 요청 을 처리 하지 않 고 요청 을 처리 합 니 다.예 를 들 어 로그,캐 시,인증 등 서 비 스 를 추가 한 다음 에 해당 하 는 응용 서버 에 전송 하여 처리 한 다음 에 처리 결 과 를 되 돌려 줍 니 다.
나의 현재 수 요 는 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 차 개발 에 편리 하 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기