如何拒绝与Apache CXF/JAXRS

问题描述:

我需要做什么非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的东西)。

有没有更好的方法来做到这一点?

您只能在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