如何拒绝与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");
最后,设置在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>
不错,但在我的问题是,我将ContainerRequestFilter识别为*可能的*解决方案,但问一个问题:“有没有更好的方法来做到这一点?” 我正在寻找一个解决方案,而不是一个servlet过滤器或ContainerRquestFilter。 – mangotang
最简单的解决方案是在tomcat或您的SSL代理上禁用http协议。但我认为你需要其他服务。 接受http/https适当的解决方案是一个过滤器。 J2EE标准过滤器不允许为每个服务器定制。你也可以考虑使用CXF拦截器,但并不是那么简单的放弃请求。由于CXF3.0'ContextRequestFilter'可用于这种类型的操作(预处理Message before service方法) – pedrofb
对我而言,不幸的是,我被困在CXF 2.2.12上。 ContextRequestFilter在该版本中不存在。所以,我最终使用了CXF拦截器。它似乎工作正常。 – mangotang