Springブートを使用してロードバランシングHandlerInterceptor
を実装しています。スプリングブートHandlerInterceptor loadbalancing
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String uri = request.getRequestURI();
if (shouldUseServer1(uri)) {
response.sendRedirect(server1Uri);
} else {
response.sendRedirect(server2Uri);
}
}
という考えは、URLに基づいて、1つのサービスまたは別のサービスにリダイレクトするということです。アプリケーションに明示的なRequestMapping
(まだ)がありません。
ここで問題は、インターセプタが呼び出されると、リクエストがデフォルトのSpringエラーハンドラにリダイレクトされることです。その結果、HttpServletRequest
に格納されているURIは/error
(実質的に元のURIへのアクセスを拒否する)に置き換えられます。
エラーハンドラにリルートされる前にリクエストを傍受する方法はありますか(元のuriを取得するには)?
リダイレクトは正常に動作します。問題は、リクエストから元のURIが必要なことです。元のURIの 'RequestMapping'がない場合、Springはデフォルトのエラーコントローラに自動的に(?)をリダイレクトします。このリダイレクトは、 'HttpServletRequest'のURIを'/error'(または何らかのもの)に変更します。その結果、元のURIにアクセスできなくなりました(どこにリダイレクトする必要があるかを判断するため)。私の現在の回避策は 'RequestMapping(path =" ** ")'でシンプルなコントローラを用意することですが、それは汚れたハックのようです。 – irundaia
ああ、申し訳ありませんが、私の理解では、インターセプタのリダイレクトにもかかわらず、/ errorへのリダイレクトが起こっていることを理解しました。私は自分の答えを更新します。元のリクエストURIをリクエスト属性として保存するだけの 'Filter'があれば大丈夫だと思います。 –
そこに、助けてくれる希望。あなたのコントローラを使用する方法は間違いなく作業が少なくて済みます。もし正直であればおそらくハックは少なくなります:)リダイレクトをやっているだけなら、おそらく 'Filter'実装ではなくインターセプタ/コントローラアプローチ。 –