2012-09-28 34 views
1

我有一個Jetty服務器,並且已經通過休息服務禁用了HTTP連接,因此客戶端連接只能通過https訪問,但是當客戶端嘗試通過http連接它會拋出一個SocketException,並將其視爲其餘的響應。我想要做的就是給一個迴應時,發生這種情況,實際上拋出一個自定義的描述性錯誤當用戶嘗試通過HTTP進行連接時發送HTTP響應而不是stck trace

回答

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"); 
    } 
    } 
} 
+0

我已經做了所有 – ThaSaleni

+0

@ThaSaleni可以發出HTTP'做'用'Filter'或重寫模塊重定向。看到更新的答案 – Raffaele

+0

我不認爲你得到我的問題,我不希望重定向通過http到https的連接,而是我阻止了http(即當你嘗試連接到http時引發套接字異常)這一切都很好,但我想抓住這個例外,並向客戶端發送更具描述性的迴應 – ThaSaleni

相關問題