【发布时间】:2013-01-21 11:23:46
【问题描述】:
我已经使用 spring mvc 框架构建了一个 Web 应用程序来发布 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);
}
这没关系,但我需要重写控制器中的每个方法以使用 resttemplate。此外,这会导致代理机器上的冗余序列化/反序列化。
我尝试使用 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 方法。
我还尝试了弹簧重定向和转发。但是重定向不会更改请求的客户端 IP 地址,所以我认为在这种情况下它是无用的。我也无法转发到另一个 URL。
有没有更合适的方法来实现这一点? 提前致谢。
【问题讨论】:
-
为什么不能使用 Apache w/ mod_rewrite 或 mod_proxy 之类的东西来执行此操作?您基本上可以在防火墙外放置一个网络服务器(通常我们称之为 DMZ),并在 FW 中设置允许该服务器与防火墙后面的服务器通信的规则。这是大多数公司解决此问题的方法。
-
谢谢,如果您的解决方案适用于我们的案例,我会尝试与系统管理员交谈。同时我将使用resttemplate并将json数据序列化/反序列化为字符串..
标签: java spring-mvc spring-boot resttemplate