您好我的服务器端休息客户端应该调用另一个服务器休息api。 它实际上与JBoss AS 7.1和Tomee一起使用,但是当我使用Wildfly 10.1时,web服务以404响应。
目标端点使用cookie身份验证来检查授权,这由servletFilter完成。 所以要调用服务我有一个cookie: Cookie:“COOKIE_NAME:TOKEN”
servlet过滤器实际上工作正常,事实上,如果我与任何其他客户端调用相同的web服务(我尝试过Intellij的一个和Postman),它工作正常。
问题只发生在使用Play WS lib通过Play框架1.2.5应用程序完成的服务器端调用。
这里的代码: (Superclass方法返回WS.WSRequest的实例)
@play.mvc.Before(priority = 0)
protected static WS.WSRequest authCookieHttpClient(String relativeUrl) throws IllegalStateException {
if (JWT_AUDIENCE != null && JWT_ISSUER != null && JWT_SECRET != null && JWT_TIMEOUT != null && API_ENDPOINT != null && AUTH_COOKIE_NAME != null) {
JWTClaims jwtClaims = new JWTClaims(
JWT_ISSUER,
Security.getConnectedUser().username,
JWT_AUDIENCE,
JWT_TIMEOUT
);
WS.WSRequest request = WS.url(API_ENDPOINT + relativeUrl);
JWTProducer jwtProducer = new JWTProducer(JWT_SECRET, jwtClaims);
try {
request.setHeader("Cookie",
AUTH_COOKIE_NAME + "=" + URLEncoder.encode(jwtProducer.signPayload(), "utf-8"));
} catch (UnsupportedEncodingException e) {
Logger.error("Unable to encode cookie info", e);
}
return request;
}
throw new IllegalStateException("Cannot use parent controller: " + ApiSubscriber.class + " without configuring API endpoint and JWT features");
}
主叫代码:
WS.HttpResponse res = authCookieHttpClient(areaUrl + sb.toString()).get();
相同的请求与Postman / Intellij Client一起工作正常(cookie标头等于播放WS请求)
使用JAX-RS impl的JBoss AS 7.1(ee6)一切正常。由Jersey提供
它不仅适用于RestEasy提供的带有JAX-RS impl的WildFly 10.1(ee7)。 (重定向像是没有通过cookie验证,所以客户返回404)
有什么建议吗? 感谢。
答案 0 :(得分:0)
问题是由play框架java客户端生成的queryString引起的。
虽然在使用Jersey的Jboss AS 7.1上工作正常,但是接受了像var1=&var2=123
这样的查询,但这会失败,但是没有引发任何异常,结果是404响应。
目标端点当然是使用@QueryParam
中的javax.ws.rs
映射queryString参数。
我找到了解决方案,将调试信息添加到WildFly独立xml(用于请求/响应),然后添加了记录的异常。
希望它有所帮助。