2016-08-15 33 views
0

我需要做什麼非HTTPS請求: 我需要弄清楚如何拒絕不通過TLS任何傳入的HTTP請求(即HTTPS)。理想情況下,如果請求未通過https,我將能夠返回404的http狀態(未找到)。如何拒絕與Apache CXF/JAXRS

我的實現如下所示: 我正在使用Apache cxf/jaxrs實現REST服務。 我使用Spring的IoC來創建服務。

在Spring應用程序上下文文件中的服務定義是這樣的:

<jaxrs:server id="testSvc" address="/"> 
    <jaxrs:serviceBeans> 
     <ref bean="svcBean"/> 
    </jaxrs:serviceBeans>  
</jaxrs:server> 

該服務的Tomcat內運行。

我想使用一個簡單的servlet過濾器或jax-rs過濾器(例如,擴展了javax.ws.rs.container.ContainerRequestFilter的東西)。

有沒有更好的方法來做到這一點?

回答

1

您只能在SSL/TLS上發佈tomcat,但我不能這樣做,因此您可以檢測到您是否在SSL會話中。從請求,使用訪問SSL會話ID:

//Tomcat 6 
String sslID = (String)request.getAttribute("javax.servlet.request.ssl_session"); 

//Tomcat 7 
String sslID = (String)request.getAttribute("javax.servlet.request.ssl_session_id"); 

tomcat SSL documentation

最後,設置在CXF一個ContainerRequestFilter訪問請求參數,如果需要

public class SSLFilter implements ContainerRequestFilter { 

    public void filter(ContainerRequestContext context) { 

     //get current httpservletRequest from CXFMessage 
     Message message = JAXRSUtils.getCurrentMessage(); 
     HttpServletRequest request = (HttpServletRequest) message.get(AbstractHTTPDestination.HTTP_REQUEST); 

     //Get SSL session ID 
     String sslID = (String)request.getAttribute("javax.servlet.request.ssl_session"); 

     // finally use context.abortWith(Response) if you need to block the request 
     if (sslId == null){ 
      Response response = Response.status(Response.Status.UNAUTHORIZED).build(); 
      context.abortWith(response); 
     } 
    } 

添加provider中止響應給你服務器

<bean id="sslFilter" class="SSLFilter"> 
<jaxrs:server id="testSvc" address="/"> 
    <jaxrs:providers> 
     <ref bean="sslFilter" /> 
    </jaxrs:providers> 
</jaxrs:server> 
+0

不錯,但在我的問題是,我將ContainerRequestFilter識別爲*可能的*解決方案,但問一個問題:「有沒有更好的方法來做到這一點?」 我正在尋找一個解決方案,而不是一個servlet過濾器或ContainerRquestFilter。 – mangotang

+0

最簡單的解決方案是在tomcat或您的SSL代理上禁用http協議。但我認爲你需要其他服務。 接受http/https適當的解決方案是一個過濾器。 J2EE標準過濾器不允許爲每個服務器定製。你也可以考慮使用CXF攔截器,但並不是那麼簡單的放棄請求。由於CXF3.0'ContextRequestFilter'可用於這種類型的操作(預處理Message before service方法) – pedrofb

+0

對我而言,不幸的是,我被困在CXF 2.2.12上。 ContextRequestFilter在該版本中不存在。所以,我最終使用了CXF攔截器。它似乎工作正常。 – mangotang