我有一个 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/