Jetty サーバーがあり、残りのサービスを介した HTTP 接続を無効にしているため、クライアント接続は https 経由でのみ行う必要がありますが、クライアントが http 経由で接続しようとすると、SocketException がスローされ、それが残りの応答として扱われます。私がしたいのは、これが発生したときに応答を返し、実際にカスタムの説明的なエラーをスローすることです
質問する
307 次
1 に答える
2
Filter
あなたはこのようなを使いたいかもしれません
public abstract class SSLOnlyFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) {
// ... cast to HTTP counterparts
if (request.isSecure()) {
chain.doFilter(request, response);
} else {
response.setStatus(HttpServletResponse.SC_OK);
// Set the message in the body
}
}
}
またはカスタム エラー ページ (あまり推奨されません)
<error-page>
<exception-type>java.net.SocketException</exception-type>
<location>/someServletHere</location>
</error-page>
デプロイメント記述子で。
ただし、クライアントが SSL なしで接続しようとした場合は、HTTP リダイレクトを発行することをお勧めします。HTTP リダイレクトを発行するには、RewriteHandler
モジュールとFilter
.
これは、モジュールを次のように構成する方法です。RedirectRegexRule
<New id="Rewrite" class="org.eclipse.jetty.rewrite.handler.RewriteHandler">
<Call name="addRule">
<Arg>
<New class="org.eclipse.jetty.rewrite.handler.RedirectRegexRule">
<Set name="regex">/(.+)</Set>
<Set name="replacement">https://host:port/$1</Set>
</New>
</Arg>
</Call>
</New>
あるいは、あなたはそれを行うことができますFilter
public abstract class SSLOnlyFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) {
// cast to HTTP request and response
if (request.isSecure()) {
chain.doFilter(request, response);
} else {
response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
// Edit this line with actual parameters. Note HTTPS
response.setHeader("Location", "https://host:port/url");
}
}
}
于 2012-09-28T09:55:49.587 に答える