【问题标题】:Unable to make working ContainerRequestFilter无法使 ContainerRequestFilter 正常工作
【发布时间】:2016-09-04 16:43:19
【问题描述】:

我正在尝试几个小时来使主题中解释的机制工作:Best practice for REST token-based authentication with JAX-RS and Jersey

但在调试之后,似乎我并没有在 ContainerRequestFilter 中停下来...... 这是我所拥有的:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import javax.ws.rs.NameBinding;

@NameBinding
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface Secured { }

我的AuthenticationFilter和主题里解释的完全一样(复制过去)

我有一个端点:

  @Path("/")
  @WebService(name="account", targetNamespace="")
  public interface ProfileCXFService
  {
  @GET
  @Secured
  @Path("/displayProfile")
  @Produces({MediaType.APPLICATION_JSON})
  @Consumes({MediaType.APPLICATION_JSON})
  public Response displayProfile(@QueryParam("token")String token, @QueryParam("profileID")String profileID);
  }

这是我的 web.xml 的内容

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<display-name>CxfRestService</display-name>
<welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/beans.xml</param-value>
</context-param>
<servlet>
    <servlet-name>CXFServlet</servlet-name>
    <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>CXFServlet</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

这是我与邮递员一起发送的请求(目前令牌在正文中,但即使我将它放在身份验证标头参数中,它也不起作用)。问题是直接执行endpoint的代码,没有调用Filter。

GET /BD-BD/rest/account/displayProfile?token=vfE1qPLiiyPx20ymp0C483VxcpCj07HKAB8cTmgXamp;profileID=35 HTTP/1.1
Host: localhost:8080
Content-Type: application/json
Cache-Control: no-cache
Postman-Token: 0908ac3d-17ab-55ef-337a-fabfe7fed387

需要配置吗?? 在此先感谢:)

【问题讨论】:

    标签: java rest endpoint


    【解决方案1】:

    使用 Apache CXF 时,过滤器和拦截器必须在 cxf.xml 配置文件中注册。此文件必须位于应用程序的类路径中。

    这是从CXF documentation 中提取的一个示例,说明注册过滤器时您的 CXF 配置文件可能是什么样的:

    <beans>
        <jaxrs:server id="customerService" address="/">
    
            <jaxrs:serviceBeans>
              <bean class="org.CustomerService" />
            </jaxrs:serviceBeans>
    
            <jaxrs:providers>
              <ref bean="authorizationFilter" />
            </jaxrs:providers>
    
            <bean id="authorizationFilter" class="com.bar.providers.AuthorizationFilter">
                <!-- authorization bean properties -->
            </bean>
    
        </jaxrs:server>
    </beans>
    

    更多详情,请查看CXF documentation about configuration

    【讨论】:

    • 非常感谢!!我去看看!
    • 明天早上我会告诉你:)
    • 工作!!事实上,我在我的 web.xml 中声明了它的过滤器 :) 非常感谢!
    • @Geoffrey 我很高兴知道这一点。如果我的回答对您有任何帮助,请考虑点击upvote 按钮:)
    • 完成。对不起,我是这个网站的初学者:)
    猜你喜欢
    • 2016-12-01
    • 1970-01-01
    • 2016-12-30
    • 2021-12-03
    • 2015-06-08
    • 2016-10-28
    • 1970-01-01
    相关资源
    最近更新 更多