Java 在Apache Karaf上使用Shiro保护CXF rest服务

Java 在Apache Karaf上使用Shiro保护CXF rest服务,java,cxf,apache-karaf,shiro,Java,Cxf,Apache Karaf,Shiro,我正在尝试使用ApacheShiro基本身份验证(ApacheShiro 1.5.0)保护基于ApacheCxf的rest服务(ApacheCxf 3.3.5) 在ApacheKaraf4.2.8中。但是,我最终在karaf日志文件中收到一条警告消息,如: ServletController | 394 - org.apache.cxf.cxf-rt-transports-http - 3.3.5 | Can't find the request for http://localhost:818

我正在尝试使用ApacheShiro基本身份验证(ApacheShiro 1.5.0)保护基于ApacheCxf的rest服务(ApacheCxf 3.3.5) 在ApacheKaraf4.2.8中。但是,我最终在karaf日志文件中收到一条警告消息,如:

ServletController | 394 - org.apache.cxf.cxf-rt-transports-http - 3.3.5 | Can't find the request for http://localhost:8181/myweb/rest-api/user's Observer
其他地方或WAB安装期间无其他例外情况。WAB在状态为active的webconsole中看起来很好,但是服务端点根本不工作,只生成上述内容 日志条目

我试图用这个WAB创建一个新的HttpContext,以确保ApacheShiro的基本身份验证不会干扰 ApacheKarafWebconsole之一(如这里所建议的:)。我也不想在Karaf中使用CXF特性提供的标准CXF上下文

My web.xml:

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <listener>
        <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>
    </listener>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/beans.xml</param-value>
    </context-param>
    <filter>
        <filter-name>ShiroFilter</filter-name>
        <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>ShiroFilter</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
        <dispatcher>INCLUDE</dispatcher>
        <dispatcher>ERROR</dispatcher>
    </filter-mapping>
    <servlet>
        <servlet-name>CXFServlet</servlet-name>
        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
        <init-param>
            <param-name>config-location</param-name>
            <param-value>classpath:META-INF/cxf/cxf-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>CXFServlet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

org.springframework.web.context.ContextLoaderListener
org.apache.shiro.web.env.EnvironmentLoaderListener
上下文配置位置
/WEB-INF/beans.xml
雪洛菲特
org.apache.shiro.web.servlet.ShiroFilter
雪洛菲特
/*
要求
向前地
包括
错误
CXF服务器
org.apache.cxf.transport.servlet.CXFServlet
配置位置
类路径:META-INF/cxf/cxf-servlet.xml
1.
CXF服务器
/*
My beans.xml:

    <import resource="classpath:META-INF/cxf/cxf.xml" />
    <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />

    <context:annotation-config />

    <!-- scans and register beans using annotation-config (metadata) -->
    <context:component-scan base-package="org.adams.karaf.service" />

    <!-- to support Java-to-JSON and vice-versa conversion -->
    <bean id="jsonProvider" class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider" />

    <!-- to support Java-to-XML and vice-versa conversion -->
    <bean id="jaxbXmlProvider" class="org.eclipse.persistence.jaxb.JAXBContextFactory" />


    <bean id="userRestServiceImplClass" class="org.adams.karaf.service.impl.UserRestServiceImpl" />

    <jaxrs:server id="restservice" address="/rest-api">
        <jaxrs:serviceBeans>
            <ref bean="userRestServiceImplClass" />
        </jaxrs:serviceBeans>
        <jaxrs:extensionMappings>
            <entry key="json" value="application/json" /> 
            <entry key="xml" value="application/xml" />         
        </jaxrs:extensionMappings>

        <jaxrs:providers>
            <ref bean="jsonProvider" />
            <ref bean="jaxbXmlProvider" />
        </jaxrs:providers>
    </jaxrs:server>

我现在的问题是:

  • 如何在新的HttpContext(WebContext)下在Karaf中创建新的CXF rest服务以避免对 阿帕奇·卡拉夫的网络控制台
  • 我的配置中缺少什么吗
  • 日志消息是否告诉某人某事

您还可以查看完整的项目。

为什么说cxf rest服务会干扰web控制台?通过安装cxf功能,您将拥有两个独立的应用程序(在同一端口上运行),由pathI分隔。pathI指的是一篇博客文章,其中提到了这种情况,请参见此处