http servlets jersey portforwarding

http - Reenviar una solicitud de servlet a otro servidor



servlets jersey (3)

Java Servlet API puede reenviar solicitudes a otra ruta dentro del mismo servidor ( host idéntico: puerto ). Pero, reenviar a un host diferente: proxy de puerto como hacer, es otra historia.

Intenté hacer eso con Jersey Client, adaptando el ServletRequest - método, encabezados, tipo de medios y cuerpo - a Jersey ClientRequest ( con un uri base diferente ), realizando la llamada y adaptando el método Jersey ClientResponse -, encabezados, tipo de medios y cuerpo - a ServletResponse .

Adaptar esos manualmente me parece incorrecto.

¿No hay una solución API de Servlet pura? ¿O un cliente HTTP capaz de adaptar las solicitudes de ida y vuelta al cambiar el host: port?


Deberías usar javax.net.HttpURLConnection

Aquí está el código psuedo para eso:

URL url = new URL("http://otherserver:otherport/url"); HttpURLConnection connection = (HttpURLConnection)url.openConnection(); // set http method if required connection.setRequestMethod("POST"); // set request header if required connection.setRequestProperty("header1", "value1"); // check status code if(connection.getResponseCode() == 200) { InputStream is = connection.getInputStream(); //transfer is to the required output stream } else { //write error }


HTTP-Proxy-Servlet hace exactamente lo que necesita.

Configuración rápida

pom.xml

<dependency> <groupId>org.mitre.dsmiley.httpproxy</groupId> <artifactId>smiley-http-proxy-servlet</artifactId> <version>1.7</version> </dependency>

web.xml

<servlet> <servlet-name>solr</servlet-name> <servlet-class>org.mitre.dsmiley.httpproxy.ProxyServlet</servlet-class> <init-param> <param-name>targetUri</param-name> <param-value>http://solrserver:8983/solr</param-value> </init-param> <init-param> <param-name>log</param-name> <param-value>true</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>solr</servlet-name> <url-pattern>/solr/*</url-pattern> </servlet-mapping>

Integración de primavera

ver también: HTTP-Proxy-Servlet Issue # 15

pom.xml

<dependency> <groupId>org.mitre.dsmiley.httpproxy</groupId> <artifactId>smiley-http-proxy-servlet</artifactId> <version>1.7</version> </dependency>

ServletWrappingControllerExt.java

import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.ServletWrappingController; public class ServletWrappingControllerExt extends ServletWrappingController { private String pathToStrip; public void setPathToStrip(String pathToStrip) { this.pathToStrip = pathToStrip; } @Override protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { final HttpServletRequest wrapper = new HttpServletRequestWrapper(request) { @Override public String getPathInfo() { //Please note that getPathInfo returns null if DispatcherServlet is configured to track url-pattern "/" //It should be configured to track url-pattern "/*". Below is a sample DispatcherServlet configuration /* <servlet> <servlet-name>spring</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>spring</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> */ String path = super.getPathInfo(); if (path.startsWith(pathToStrip)) { final int length = pathToStrip.length(); path = path.substring(length); } return path; } @Override public String getServletPath() { return super.getServletPath(); } }; return super.handleRequestInternal(wrapper, response); } }

Configuración de frijoles

<bean id="myServletWrapper" class="ServletWrappingControllerExt"> <property name="pathToStrip" value="/solr"/> <property name="servletClass" value="org.mitre.dsmiley.httpproxy.ProxyServlet" /> <property name="servletName" value="solr" /> <property name="initParameters"> <props> <prop key="targetUri">http://solrserver:8983/solr</prop> <prop key="log">true</prop> </props> </property> </bean> <bean id="myServletUrlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="urlMap"> <map> <entry key="/solr/**" value-ref="myServletWrapper" /> </map> </property> <property name="order" value="1" /> </bean>


Por lo que yo entiendo, debe enviar request desde Servlet y obtener response de otro servidor en la suya, puede ser que necesite un cliente HTTP ( descripción general ) para eso.
Esta pregunta también podría ayudarte.