1
我有一個Jetty服務器,並且已經通過休息服務禁用了HTTP連接,因此客戶端連接只能通過https訪問,但是當客戶端嘗試通過http連接它會拋出一個SocketException,並將其視爲其餘的響應。我想要做的就是給一個迴應時,發生這種情況,實際上拋出一個自定義的描述性錯誤當用戶嘗試通過HTTP進行連接時發送HTTP響應而不是stck trace
我有一個Jetty服務器,並且已經通過休息服務禁用了HTTP連接,因此客戶端連接只能通過https訪問,但是當客戶端嘗試通過http連接它會拋出一個SocketException,並將其視爲其餘的響應。我想要做的就是給一個迴應時,發生這種情況,實際上拋出一個自定義的描述性錯誤當用戶嘗試通過HTTP進行連接時發送HTTP響應而不是stck trace
您可能需要使用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");
}
}
}
我已經做了所有 – ThaSaleni
@ThaSaleni可以發出HTTP'做'用'Filter'或重寫模塊重定向。看到更新的答案 – Raffaele
我不認爲你得到我的問題,我不希望重定向通過http到https的連接,而是我阻止了http(即當你嘗試連接到http時引發套接字異常)這一切都很好,但我想抓住這個例外,並向客戶端發送更具描述性的迴應 – ThaSaleni