spring mvcフレームワークを使用してRESTサービスを公開するWebアプリケーションをビルドしました。 例えば:spring mvc rest serviceリダイレクト/フォワード/プロキシ
@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);
}
.
.
.
これはokですが、私は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にも転送できませんでした。
これを達成するより適切な方法はありますか? ありがとうございます。
あなたがこれを行うために/ mod_rewriteのか、mod_proxyをwがApacheのようなものを使用することができませんでしたのはなぜ?基本的にはファイアウォールの外側にウェブサーバー(通常はDMZと呼ぶ)を設置し、ファイアウォールの背後にあるサーバーと通信できるようにFWにルールを設定します。これはほとんどの企業がこの問題を解決する方法です。 – CodeChimp
ありがとうございました。あなたのソリューションが私たちのために働くならば、私はsysの管理者と話そうとします。一方、resttemplateを使用して、jsonデータをシリアル化/シリアル化して文字列に変換します。 – nilgun