Ich habe eine Web-Anwendung mit Feder Mvc-Framework zu veröffentlichen REST-Dienste. Zum Beispiel:Spring Mvc Rest Service Redirect/Forward/Proxy
@Controller
@RequestMapping("/movie")
public class MovieController {
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public @ResponseBody Movie getMovie(@PathVariable String id, @RequestBody user) {
return dataProvider.getMovieById(user,id);
}
.
.
.
Jetzt muss ich meine Anwendung bereitstellen, aber ich habe folgendes Problem: Die Clients, auf denen keinen direkten Zugriff auf den Computer haben die Anwendung befindet (Es gibt eine Firewall). Daher benötige ich einen Umleitungs-Layer auf einem Proxy-Rechner (auf den die Clients zugreifen können), der den eigentlichen Rest-Service aufruft.
Ich habe versucht, einen neuen Anruf RestTemplate mit: Beispiel:
@Controller
@RequestMapping("/movieProxy")
public class MovieProxyController {
private String address= "http://xxx.xxx.xxx.xxx:xx/MyApp";
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public @ResponseBody Movie getMovie(@PathVariable String id,@RequestBody user,final HttpServletResponse response,final HttpServletRequest request) {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
RestTemplate restTemplate = new RestTemplate();
return restTemplate.exchange(address+ request.getPathInfo(), request.getMethod(), new HttpEntity<T>(user, headers), Movie.class);
}
.
.
.
Das ist in Ordnung, aber ich brauche jede Methode in der Steuerung neu zu schreiben, die resttemplate zu verwenden. Dies führt auch zu einer redundanten Serialisierung/Deserialisierung auf dem Proxy-Rechner.
Ich habe versucht, eine generische Funktion restemplate zu schreiben, aber es hat nicht geklappt:
@Controller
@RequestMapping("/movieProxy")
public class MovieProxyController {
private String address= "http://xxx.xxx.xxx.xxx:xx/MyApp";
@RequestMapping(value = "/**")
public ? redirect(final HttpServletResponse response,final HttpServletRequest request) {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
RestTemplate restTemplate = new RestTemplate();
return restTemplate.exchange(address+ request.getPathInfo(), request.getMethod(), ? , ?);
}
.
.
.
Ich konnte nicht ein Verfahren zur Herstellung resttemplate finden, die mit Anfrage und Antwort Objekten funktionieren.
Ich habe auch versucht Federumleitung und weiterleiten. Aber redirect ändert nicht die Client-IP-Adresse der Anfrage, so denke ich, dass es in diesem Fall nutzlos ist. Ich könnte auch nicht zu einer anderen URL weiterleiten.
Gibt es einen geeigneteren Weg, dies zu erreichen? Vielen Dank im Voraus.
Warum konnte man nicht so etwas wie Apache verwendet w/mod_rewrite oder mod_proxy dies zu tun? Sie würden im Grunde einen Webserver außerhalb Ihrer Firewall (normalerweise nennen wir das die DMZ) und Setup-Regeln in der FW, die es diesem Server ermöglicht, mit Ihrem Server hinter der Firewall zu sprechen. So lösen die meisten Unternehmen dieses Problem. – CodeChimp
danke, ich werde versuchen, mit sys Admins zu sprechen, wenn Ihre Lösung für unseren Fall funktioniert. Unterdessen benutze ich resttemplate und serialize/deserialize json Daten zum Zeichenkette. – nilgun