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 回答