spring mvc reste un service de redirection / avant / proxy
J'ai créer une application web à l'aide de spring mvc cadre de publier des services REST.
Par exemple:
@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);
}
Maintenant, j'ai besoin de déployer mon application mais j'ai le problème suivant:
Les clients n'ont pas d'accès direct à l'ordinateur sur lequel réside l'application (Il y a un pare-feu). Donc j'ai besoin d'une redirection couche sur un ordinateur proxy (accessible par les clients) qui appelle le réel reste du service.
J'ai essayé de faire un nouvel appel à l'aide de RestTemplate:
Par Exemple:
@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);
}
C'est ok mais j'ai besoin de réécrire chaque méthode dans le contrôleur à utiliser le resttemplate. Aussi, cela provoque redondant de sérialisation/désérialisation sur l'ordinateur proxy.
J'ai essayé d'écrire une fonction générique à l'aide de restemplate, mais il n'a pas fonctionné:
@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(), ? , ?);
}
Je ne pouvais pas trouver une méthode de resttemplate, qui travaille avec les objets request et response.
J'ai aussi essayé de printemps rediriger vers l'avant. Mais la redirection ne change pas la demande du client adresse ip donc je pense qu'il est inutile dans ce cas. Je ne pouvais pas en avant vers une autre URL, soit.
Est-il plus approprié pour y parvenir?
Merci à l'avance.
- Pourquoi ne pas utiliser quelque chose comme Apache w/ mod_rewrite ou mod_proxy pour ce faire? Il suffisait de mettre un serveur à l'extérieur de votre pare-feu (généralement, nous appelons cela la DMZ), et des règles de configuration dans le FW qui permet au serveur de parler à votre serveur derrière le pare-feu. C'est de cette façon que la plupart des entreprises de résoudre ce problème.
- merci, je vais essayer de parler à sys admins si votre solution fonctionne pour notre cas. En attendant je vais utiliser resttemplate et de sérialiser/désérialiser les données json à la chaîne..
Vous devez vous connecter pour publier un commentaire.
Vous pouvez mettre en miroir/proxy toutes les demandes avec ceci:
Ce ne sera pas de miroir tout en-têtes.
String
, maisResponseEntity
. Vous pouvez créer votre propre instance deResponseEntity
avec certains sous-ensembles de responseEntity les en-têtes, ou avec des personnalisés. Espérons que cela aidera quelqu'un.Vous pouvez utiliser Netflix Zuul pour acheminer les demandes provenant d'une source, application à une autre source de l'application.
Disons que vous avez deux applications: 1.chansons-app, 2.api-passerelle
Dans l'api-application de la passerelle, ajoutez d'abord le zuul dépendance au, alors vous pouvez simplement définir votre règle de routage dans l'application.yml comme suit:
pom.xml
application.yml
et enfin exécuter l'api-application de la passerelle comme:
Maintenant, la passerelle route tous les
/api/songs/
demandes dehttp://localhost:8081/songs/
.Un exemple de travail est ici: https://github.com/muatik/spring-playground/tree/master/spring-api-gateway
D'une autre ressource: http://www.baeldung.com/spring-rest-with-zuul-proxy
Voici ma version modifiée de l'original de la réplique, qui diffère en quatre points:
UriComponentsBuilder
.headerName != null && !"Transfer-Encoding".equals(headerName);
consumes="multipart/form-data"
pour cela, je ne pense pas qu'il est possible d'inclure facilement ce ici, mais si vous y arrivez, faites le moi savoir.proxy contrôleur avec oauth2
Si vous pouvez vous en sortir avec l'aide d'un niveau inférieur solution comme mod_proxy qui serait le plus simple à faire, mais si vous avez besoin de plus de contrôle (par exemple, la sécurité, la traduction, la logique d'entreprise), vous pouvez prendre un coup d'oeil à Apache Camel: http://camel.apache.org/how-to-use-camel-as-a-http-proxy-between-a-client-and-server.html
Vous besoin de quelque chose comme
jetty transparent proxy
, ce qui permettra de rediriger votre appel, et vous obtenez une chance de remplacer la demande si vous avez besoin. Vous pouvez obtenir des détails à http://reanimatter.com/2016/01/25/embedded-jetty-as-http-proxy/