Wie finde ich die IP-Adresse einer eingehenden RESTful-Anfrage mit JAX-RS auf Heroku?
Ich Schreibe ein Java-RESTful-Dienst, gehostet auf Heroku basiert auf einem Beispiel -> https://api.heroku.com/myapps/template-java-jaxrs/clone
Meine sample-service:
package com.example.services;
import com.example.models.Time;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("/time")
@Produces(MediaType.APPLICATION_JSON)
public class TimeService {
@GET
public Time get() {
return new Time();
}
}
Mein main ist:
public class Main {
public static final String BASE_URI = getBaseURI();
/**
* @param args
*/
public static void main(String[] args) throws Exception{
final Map<String, String> initParams = new HashMap<String, String>();
initParams.put("com.sun.jersey.config.property.packages","services.contracts");
System.out.println("Starting grizzly...");
SelectorThread threadSelector = GrizzlyWebContainerFactory.create(BASE_URI, initParams);
System.out.println(String.format("Jersey started with WADL available at %sapplication.wadl.",BASE_URI, BASE_URI));
}
private static String getBaseURI()
{
return "http://localhost:"+(System.getenv("PORT")!=null?System.getenv("PORT"):"9998")+"/";
}
}
Meine Frage ist wie kann ich herausfinden, in meinem Dienst die IP-Adresse und port-Kombination) die Anforderung aus? Ich habe Sachen gelesen, die auf @Kontext, die injiziert javax.ws.rs.core.HttpHeaders, javax.ws.rs.core.Anfrage, etc. Jedoch keine eingehenden IP-oder port-info vorhanden ist.
Ich wissen, ob Sie implementieren von com.Sonne.grizzly.tcp.Adapter, die Sie tun können, so etwas wie:
public static void main(String[] args) {
SelectorThread st = new SelectorThread();
st.setPort(8282);
st.setAdapter(new EmbeddedServer());
try {
st.initEndpoint();
st.startEndpoint();
} catch (Exception e) {
System.out.println("Exception in SelectorThread: " + e);
} finally {
if (st.isRunning()) {
st.stopEndpoint();
}
}
}
public void service(Request request, Response response)
throws Exception {
String requestURI = request.requestURI().toString();
System.out.println("New incoming request with URI: " + requestURI);
System.out.println("Request Method is: " + request.method());
if (request.method().toString().equalsIgnoreCase("GET")) {
response.setStatus(HttpURLConnection.HTTP_OK);
byte[] bytes = "Here is my response text".getBytes();
ByteChunk chunk = new ByteChunk();
response.setContentLength(bytes.length);
response.setContentType("text/plain");
chunk.append(bytes, 0, bytes.length);
OutputBuffer buffer = response.getOutputBuffer();
buffer.doWrite(chunk, response);
response.finish();
}
}
public void afterService(Request request, Response response)
throws Exception {
request.recycle();
response.recycle();
}
und Zugang
request.remoteAddr()
Aber ich würde mich wirklich trennen mögen meine RESTful-API in einer stärker strukturierten Weise wie in meiner ersten Umsetzung.
Jegliche Hilfe würde sehr geschätzt werden. Danke!
InformationsquelleAutor der Frage Luke | 2012-11-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als Lukas sagte, wenn mit Heroku, der remote host ist die AWS-tier-Anwendung, daher die EC2-ip-Adresse.
"X-Forwarded-For" - header der Antwort:
InformationsquelleAutor der Antwort Ethan
Können Sie injizieren
HttpServletRequest
:InformationsquelleAutor der Antwort
Basierend auf @user647772 und @Ethan fusion. Dank Ihnen 😉
injizieren HttpServletRequest:
InformationsquelleAutor der Antwort boly38