【问题标题】:Error in Accept-Encoding header in jdk 1.8.0_91jdk 1.8.0_91 中的 Accept-Encoding 标头错误
【发布时间】:2016-12-22 03:44:28
【问题描述】:

我正在拨打POST 电话。该调用在一个系统(比如 system1)上运行,而在另一个系统(比如 system2)上不运行。

我收到以下错误:

[2016-08-15 20:22:43.242] [qtp2024542466-14] [ERROR] [c.a.b.e.m.AbstractExceptionMapper] [Error executing rest API.Error Message: Illegal character(s) in message header field: Accept-Encoding:> Req: (POST //backend.morph.ai:8080/rest/panel/auth/signup?)@691675178 org.eclipse.jetty.server.Request@293a202a
Ref id: 201608152022-695a6dc8-10f6-4382-ae93-de62c84fcc21] [javax.ws.rs.ProcessingException: Illegal character(s) in message header field: Accept-Encoding:
    at org.glassfish.jersey.client.ClientRuntime.invoke(ClientRuntime.java:263)
    at org.glassfish.jersey.client.JerseyInvocation$1.call(JerseyInvocation.java:671)
    at org.glassfish.jersey.client.JerseyInvocation$1.call(JerseyInvocation.java:668)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:228)
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:444)
    at org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.java:668)
    at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:428)
    at org.glassfish.jersey.client.JerseyInvocation$Builder.post(JerseyInvocation.java:334)
    at com-------------------------Internal Class
    at com-------------------------Internal Class
    at com-------------------------Internal Class
    at com-------------------------Internal Class
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory$1.invoke(ResourceMethodInvocationHandlerFactory.java:81)
    at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:144)
    at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:161)
    at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ResponseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:160)
    at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:99)
    at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:389)
    at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:347)
    at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:102)
    at org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:308)
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:267)
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317)
    at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:291)
    at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1140)
    at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:403)
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:386)
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:334)
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:221)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:816)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1684)
    at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:176)
    at org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145)
    at org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92)
    at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:394)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1667)
    at com-------------------------Internal Class
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1667)
    at org.eclipse.jetty.servlets.CrossOriginFilter.handle(CrossOriginFilter.java:275)
    at org.eclipse.jetty.servlets.CrossOriginFilter.doFilter(CrossOriginFilter.java:238)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1667)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:581)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:226)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1113)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:511)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1047)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:213)
    at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:109)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:119)
    at org.eclipse.jetty.server.Server.handle(Server.java:517)
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:302)
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:242)
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:238)
    at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:95)
    at org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:57)
    at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceAndRun(ExecuteProduceConsume.java:213)
    at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:147)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:654)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:572)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.IllegalArgumentException: Illegal character(s) in message header field: Accept-Encoding:
    at sun.net.www.protocol.http.HttpURLConnection.checkMessageHeader(HttpURLConnection.java:489)
    at sun.net.www.protocol.http.HttpURLConnection.isExternalMessageHeaderAllowed(HttpURLConnection.java:459)
    at sun.net.www.protocol.http.HttpURLConnection.setRequestProperty(HttpURLConnection.java:3018)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.setRequestProperty(HttpsURLConnectionImpl.java:316)
    at org.glassfish.jersey.client.HttpUrlConnector.setOutboundHeaders(HttpUrlConnector.java:362)
    at org.glassfish.jersey.client.HttpUrlConnector.access$100(HttpUrlConnector.java:91)
    at org.glassfish.jersey.client.HttpUrlConnector$4.getOutputStream(HttpUrlConnector.java:325)
    at org.glassfish.jersey.message.internal.CommittingOutputStream.commitStream(CommittingOutputStream.java:200)
    at org.glassfish.jersey.message.internal.CommittingOutputStream.commitStream(CommittingOutputStream.java:194)
    at org.glassfish.jersey.message.internal.CommittingOutputStream.commit(CommittingOutputStream.java:262)
    at org.glassfish.jersey.message.internal.OutboundMessageContext.commitStream(OutboundMessageContext.java:816)
    at org.glassfish.jersey.client.ClientRequest.writeEntity(ClientRequest.java:545)
    at org.glassfish.jersey.client.HttpUrlConnector._apply(HttpUrlConnector.java:329)
    at org.glassfish.jersey.client.HttpUrlConnector.apply(HttpUrlConnector.java:242)
    at org.glassfish.jersey.client.ClientRuntime.invoke(ClientRuntime.java:254)
    ... 73 common frames omitted

标题

我在两个系统上都发送以下标头:Accept-Encoding: gzip, deflate, br

Java 版本 系统1:

java version "1.8.0_51"
Java(TM) SE Runtime Environment (build 1.8.0_51-b16)
Java HotSpot(TM) 64-Bit Server VM (build 25.51-b03, mixed mode)

系统2:

openjdk version "1.8.0_91"
OpenJDK Runtime Environment (build 1.8.0_91-8u91-b14-3ubuntu1~16.04.1-b14)
OpenJDK 64-Bit Server VM (build 25.91-b14, mixed mode)

我也试过检查抛出错误的源代码(checkMessageHeader方法的检查代码):

dk8-b91:http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/169451cf0cc5/src/share/classes/sun/net/www/protocol/http/HttpURLConnection.java

jdk8-b51:http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/e865efbc7105/src/share/classes/sun/net/www/protocol/http/HttpURLConnection.java

在这两个文件中,checkMessageHeader 的源代码是相同的。源代码也在检查\n 并在检查某些条件后抛出错误,但前提是\n 存在。我的键或值中没有任何\n

我无法理解可能是什么问题?或者如何进行?

【问题讨论】:

  • 检查Accept-Encoding的内容,如果可能的话,添加到问题中
  • 我已经在问题中添加了这一点,请参阅下面的共享堆栈跟踪。让我强调一下
  • 尝试删除前导逗号以及所有空格。
  • 我错误地放在这里的前导逗号(现在删除它)。让我删除空格后试试。
  • 我试过去掉空格,还是报错。

标签: java http java-8 httpurlconnection http-accept-encoding


【解决方案1】:

为我的案例找到了解决方案。 ':' 字符造成了问题(至少在我的情况下)。

如果我执行以下操作:

headers.put("授权",Collections.singletonList("Bearer 123"));

没关系。

所以,我认为在这个线程的原始问题中,如果提供了“Accept-Encoding”,而不是将密钥提供为“Accept-Encoding:”,那么可能会起作用。

切!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-12
    • 2015-04-20
    • 2013-05-14
    • 2012-06-18
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 2011-12-20
    相关资源
    最近更新 更多