Jersey URL weiterleiten

imox

Aktives Mitglied
Hallo Leute,

ich möchte eine url aufrufen und dann den response ausliefern. Also ich will in dem Sinne als proxy funktionieren. Ich will absolut nichts verändern oder so. Also eine URL aufrufen ist ja kein Problem. Das mache ich so

CloseableHttpClient client = HttpClientBuilder.create().build();
CloseableHttpResponse execute = execute(client, new HttpGet("URL"));

Aber wenn ich den response bei mir zurück gebe, gibst immer verschieden exceptions. Entweder stimmt der media type nicht, oder es ist ein GZIP Format womit jersey dann nicht klar kommt etc. Ich suche halt nach einer Lösung wo ich den stream einfach 1 zu 1 durchschleife.

Könnt ihr mir sagen wie ich das mache?

Lieben Gruß
Imo
 

KonradN

Super-Moderator
Mitarbeiter
Das ist ja schon im Kern das, was du brauchst.

Das Problem ist jetzt, dass Du den content type nicht weiter gibst. Den kannst Du aus der Response (Wieso nennst Du diese execute? Das ist doch die Antwort vom Request!) auslesen: execute.getMediaType()

Nun musst Du natürlich eine individuelle Response zurück geben. Du kannst das z.B. mit etwas machen wie:


Java:
Response.ResponseBuilder responseBuilder = Response.status(execute.getStatus())
                .entity(execute.readEntity(String.class))
                .type(execute.getMediaType());

Dann evtl. noch die ganzen Header übernehmen, die Du brauchst, also execute.getHeaders() durchgehen und mit responseBuilder.header(..., ...) setzen.

Am Ende dann einfach ein return responseBuilder.build();

Damit wirst Du dann bestimmt einen Schritt weiter sein. Aber das bekommt man nur mit Tests heraus.

Generell würde ich Dir aber raten, einfach einmal deutlich mehr über http zu lesen. Wenn Du hier sowas bauen willst, dann solltest Du aus meiner Sicht verstanden haben, was Du da machst, also was die einzelnen Header sind, was der Content Type ist und all sowas...
 

KonradN

Super-Moderator
Mitarbeiter
Weil sich das etwas interessant anhörte, einfach einmal etwas Code, den ChatGPT vorgeschlagen hat und der diverse weitere Dinge mit abdeckt. Ist natürlich ungetestet und nur eine Denkanregung - in der Hoffnung, dass ChatGPT da nichts erfunden hat :)
Java:
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.Path;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.Response;
import org.glassfish.jersey.client.ClientConfig;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.HttpHeaders;

@Path("/proxy")
public class HttpProxyResource {

    @Path("/{any: .*}") // dieser Pfad fängt alles ab
    public void proxy(@Context HttpServletRequest request, @Context HttpServletResponse response) {
        try {
            ClientConfig config = new ClientConfig();
            Client client = ClientBuilder.newClient(config);
            String targetUrl = "http://target-server.com" + request.getRequestURI();
            if (request.getQueryString() != null) {
                targetUrl += "?" + request.getQueryString();
            }
            WebTarget target = client.target(targetUrl);

            // Erstellt die Anfrage mit der gleichen Methode und Daten wie das Original
            Response targetResponse = target
                    .request()
                    .method(request.getMethod(), Entity.entity(request.getInputStream(), request.getContentType()));

            // Fügt Header und Status-Code der Antwort hinzu
            MultivaluedMap<String, Object> headers = targetResponse.getHeaders();
            for (String headerName : headers.keySet()) {
                response.addHeader(headerName, headers.getFirst(headerName).toString());
            }

            response.setStatus(targetResponse.getStatus());

            // Fügt den Body der Antwort hinzu
            MediaType contentType = targetResponse.getMediaType();
            if (contentType != null) {
                response.setContentType(contentType.toString());
            }

            byte[] entity = targetResponse.readEntity(byte[].class);
            if (entity != null) {
                response.getOutputStream().write(entity);
            }

        } catch (Exception e) {
            // Fehlerbehandlung
            e.printStackTrace();
        }
    }
}
 

imox

Aktives Mitglied
Super, ganz vielen Dank. Ich habe versucht das nach zu bauen leider kann ich die dependence

<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>2.1.1</version>
</dependency>

nicht hinzufügen. Ich kann zwar den tomcat starten, allerdings scheint es ein Konflikt mit der javax.servlet-api api zu geben. Zumindest bekomme ich immer diese Exception.

Hast du vielleicht eine Idee woran das liegen kann?

Code:
20:22:18.517 [http-bio-8080-exec-10] ERROR d.p.p.platform.servlet.NoCacheFilter - Unexpected error
javax.servlet.ServletException: Filtered request failed.
    at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:384) ~[shiro-web-1.2.6.jar:1.2.6]
    at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125) ~[shiro-web-1.2.6.jar:1.2.6]
    at com.google.inject.servlet.FilterDefinition.doFilter(FilterDefinition.java:163) ~[guice-servlet-3.0.jar:na]
    at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:58) ~[guice-servlet-3.0.jar:na]
    at com.google.inject.servlet.FilterDefinition.doFilter(FilterDefinition.java:168) ~[guice-servlet-3.0.jar:na]
    at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:58) ~[guice-servlet-3.0.jar:na]
    at de.parceval.portal.platform.servlet.PersistFilter.doFilter(PersistFilter.java:59) ~[classes/:na]
    at com.google.inject.servlet.FilterDefinition.doFilter(FilterDefinition.java:163) ~[guice-servlet-3.0.jar:na]
    at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:58) ~[guice-servlet-3.0.jar:na]
    at com.google.inject.servlet.ManagedFilterPipeline.dispatch(ManagedFilterPipeline.java:118) ~[guice-servlet-3.0.jar:na]
    at com.google.inject.servlet.GuiceFilter.doFilter(GuiceFilter.java:113) ~[guice-servlet-3.0.jar:na]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) [tomcat-embed-core-7.0.47.jar:7.0.47]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) [tomcat-embed-core-7.0.47.jar:7.0.47]
    at de.parceval.portal.platform.servlet.NoCacheFilter.doFilter(NoCacheFilter.java:43) ~[classes/:na]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) [tomcat-embed-core-7.0.47.jar:7.0.47]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) [tomcat-embed-core-7.0.47.jar:7.0.47]
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) [tomcat-embed-core-7.0.47.jar:7.0.47]
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) [tomcat-embed-core-7.0.47.jar:7.0.47]
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) [tomcat-embed-core-7.0.47.jar:7.0.47]
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) [tomcat-embed-core-7.0.47.jar:7.0.47]
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) [tomcat-embed-core-7.0.47.jar:7.0.47]
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) [tomcat-embed-core-7.0.47.jar:7.0.47]
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) [tomcat-embed-core-7.0.47.jar:7.0.47]
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) [tomcat-embed-core-7.0.47.jar:7.0.47]
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041) [tomcat-embed-core-7.0.47.jar:7.0.47]
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603) [tomcat-embed-core-7.0.47.jar:7.0.47]
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) [tomcat-embed-core-7.0.47.jar:7.0.47]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_202]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_202]
    at java.lang.Thread.run(Thread.java:748) [na:1.8.0_202]
Caused by: java.lang.AbstractMethodError: javax.ws.rs.core.UriBuilder.uri(Ljava/lang/String;)Ljavax/ws/rs/core/UriBuilder;
    at javax.ws.rs.core.UriBuilder.fromUri(UriBuilder.java:96) ~[javax.ws.rs-api-2.1.1.jar:2.1.1]
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:669) ~[jersey-servlet-1.19.3.jar:1.19.3]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) ~[tomcat-embed-core-7.0.47.jar:7.0.47]
    at com.google.inject.servlet.ServletDefinition.doService(ServletDefinition.java:263) ~[guice-servlet-3.0.jar:na]
    at com.google.inject.servlet.ServletDefinition.service(ServletDefinition.java:178) ~[guice-servlet-3.0.jar:na]
    at com.google.inject.servlet.ManagedServletPipeline.service(ManagedServletPipeline.java:91) ~[guice-servlet-3.0.jar:na]
    at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:62) ~[guice-servlet-3.0.jar:na]
    at org.apache.shiro.guice.web.SimpleFilterChain.doFilter(SimpleFilterChain.java:44) ~[shiro-guice-1.2.6.jar:1.2.6]
    at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108) ~[shiro-web-1.2.6.jar:1.2.6]
    at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137) ~[shiro-web-1.2.6.jar:1.2.6]
    at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125) ~[shiro-web-1.2.6.jar:1.2.6]
    at org.apache.shiro.guice.web.SimpleFilterChain.doFilter(SimpleFilterChain.java:41) ~[shiro-guice-1.2.6.jar:1.2.6]
    at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449) ~[shiro-web-1.2.6.jar:1.2.6]
    at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365) ~[shiro-web-1.2.6.jar:1.2.6]
    at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90) ~[shiro-core-1.2.6.jar:1.2.6]
    at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83) ~[shiro-core-1.2.6.jar:1.2.6]
    at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:383) ~[shiro-core-1.2.6.jar:1.2.6]
    at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362) ~[shiro-web-1.2.6.jar:1.2.6]
    ... 29 common frames omitted
Okt 12, 2023 8:22:18 PM org.apache.catalina.core.StandardWrapperValve invoke
SCHWERWIEGEND: Servlet.service() for servlet [default] in context with path [] threw exception [Filter execution threw an exception] with root cause
java.lang.AbstractMethodError: javax.ws.rs.core.Response.getStatusInfo()Ljavax/ws/rs/core/Response$StatusType;
    at javax.ws.rs.WebApplicationException.computeExceptionMessage(WebApplicationException.java:188)
    at javax.ws.rs.WebApplicationException.<init>(WebApplicationException.java:162)
    at javax.ws.rs.WebApplicationException.<init>(WebApplicationException.java:67)
    at de.parceval.portal.platform.UserWebApplicationException.<init>(UserWebApplicationException.java:13)
    at de.parceval.portal.platform.servlet.NoCacheFilter.doFilter(NoCacheFilter.java:46)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
 

imox

Aktives Mitglied
Habs jetzt so gelöst und damit ist das für mich auch beantwortet. Vielen Dank

@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
String externalBaseUrl = "URL";
String requestUri = request.getPathInfo();
String externalURL = externalBaseUrl + requestUri;
URL url = new URL(externalURL);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod(request.getMethod());

Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String headerName = headerNames.nextElement();
String headerValue = request.getHeader(headerName);
connection.setRequestProperty(headerName, headerValue);
}

InputStream inputStream = connection.getInputStream();
OutputStream outputStream = response.getOutputStream();
for (Map.Entry<String, java.util.List<String>> entry : connection.getHeaderFields().entrySet()) {
String headerName = entry.getKey();
if (headerName == null || headerName.equals("Transfer-Encoding"))
continue;
for (String headerValue : entry.getValue()) {
response.addHeader(headerName, headerValue);
}
}

byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
outputStream.flush();
connection.disconnect();
} catch (IOException e) {
e.printStackTrace();
}

}
 

Ähnliche Java Themen

Neue Themen


Oben