java - 当用户尝试通过 HTTP 连接时发回 HTTP 响应而不是堆栈跟踪

标签 java rest jetty

我有一个 Jetty 服务器,并且通过 REST 服务禁用了 HTTP 连接,因此客户端连接必须只能通过 https 进行,但是当客户端尝试通过 http 连接时,它会抛出 SocketException 并将其视为 REST 响应。我想做的是在发生这种情况时给出响应并实际上抛出自定义描述性错误

最佳答案

您可能想使用这样的过滤器

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模块和一个过滤器

这是使用 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");
    }
  } 
}

关于java - 当用户尝试通过 HTTP 连接时发回 HTTP 响应而不是堆栈跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12637606/

相关文章:

WCF 身份验证策略

java - 打开 REST Web 服务返回的 PDF

java - 在 Eclipse IDE 中使用带有嵌入式 Jetty 7 的 JSP,获取 LogConfigurationException

java - 实现我自己的按钮监听器

用于测试的 REST 监听工具

java - 用户输入后重复执行的代码

linux - 如何设置jetty服务启动

java - 是否可以使用框架 spring 5 运行 java 10?

java - 使用 VLCJ 播放视频时不显示文件路径

java - gwt中的流程布局