Я создал веб-приложение с использованием Spring MVC Framework для публикации сервисов REST. Например:
@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);
}
Теперь мне нужно развернуть приложение, но у меня возникла следующая проблема: клиенты не имеют прямого доступа к компьютеру, на котором находится приложение (имеется брандмауэр). Поэтому мне нужен слой перенаправления на прокси-машине (доступной для клиентов), которая вызывает реальный сервис отдыха.
Я попытался сделать новый вызов, используя RestTemplate: Например:
@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);
}
Это нормально, но мне нужно переписать каждый метод в контроллере, чтобы использовать шаблон рестайта. Кроме того, это вызывает избыточную сериализацию/десериализацию на прокси-машине.
Я попытался написать обобщенную функцию, используя restemplate, но это не сработало:
@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(), ? , ?);
}
Я не смог найти метод resttemplate, который работает с объектами запроса и ответа.
Я также пытался spring перенаправить и вперед. Но редирект не меняет IP-адрес клиента запроса, поэтому я думаю, что в этом случае он бесполезен. Я также не смог переслать на другой URL.
Есть ли более подходящий способ добиться этого? Заранее спасибо.