1

Jetty サーバーがあり、残りのサービスを介した HTTP 接続を無効にしているため、クライアント接続は https 経由でのみ行う必要がありますが、クライアントが http 経由で接続しようとすると、SocketException がスローされ、それが残りの応答として扱われます。私がしたいのは、これが発生したときに応答を返し、実際にカスタムの説明的なエラーをスローすることです

4

1 に答える 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 に答える