无法从码头 post 请求中检索表单数据
Not able to retrieve form data from jetty post request
我正在尝试向现有码头应用程序添加 Azure AD 身份验证支持。我被重定向到我的应用程序 post 使用 Azure AD 进行身份验证,请求看起来像这样
我的请求转储 object 看起来像
org.eclipse.jetty.server.Request@46b8a08d[
_async=org.eclipse.jetty.server.AsyncContinuation@26bb9274@DISPATCHED,
initial,
_asyncSupported=true,
_attributes= {
javax.servlet.request.key_size=128,
javax.servlet.request.cipher_suite=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
javax.servlet.request.ssl_session_id=5cAbFe3eCbFfA8Ca84A546Cb995105F012E83eD556A493E55973F5A074A91eE3
},
_authentication=<null>,
_baseParameters= {
},
_characterEncoding=<null>,
_connection=AsyncHttpConnection@b7de4c,
g=HttpGenerator {
s=0,
h=-1,
b=-1,
c=-1
},
p=HttpParser {
s=-5,
l=5,
c=0
},
r=1,
_context=ServletContext@o.e.j.s.ServletContextHandler {
/,
null
},
_newContext=false,
_contextPath=,
_cookies=<null>,
_cookiesExtracted=false,
_dispatcherType=REQUEST,
_dns=false,
_endp=SSL NOT_HANDSHAKING i/o/u=0/0/0 ishut=false oshut=false {
AsyncHttpConnection@b7de4c,
g=HttpGenerator {
s=0,
h=-1,
b=-1,
c=-1
},
p=HttpParser {
s=-5,
l=5,
c=0
},
r=1
},
_handled=false,
_inputState=1,
_method=GET,
_parameters= {
},
_paramsExtracted=true,
_pathInfo=<null>,
_port=0,
_protocol=HTTP/1.1,
_queryEncoding=<null>,
_queryString=<null>,
_reader=<null>,
_readerEncoding=<null>,
_remoteAddr=<null>,
_remoteHost=<null>,
_requestAttributeListeners=<null>,
_requestedSessionId=<null>,
_requestedSessionIdFromCookie=false,
_requestURI=<null>,
_savedNewSessions=<null>,
_scheme=https,
_scope=org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher-142075f1,
_serverName=<null>,
_servletPath=/token,
_session=<null>,
_sessionManager=<null>,
_timeStamp=1554775615151,
_dispatchTime=0,
_timeStampBuffer=<null>,
_uri=/token,
_multiPartInputStream=<null>
]
我尝试遍历 header 和属性,但在 header 中只得到 Connection
,在属性
中得到 javax.servlet.request.key_size, javax.servlet.request.cipher_suite, javax.servlet.request.ssl_session_id
我的通话记录看起来像
java.lang.Thread.getStackTrace(Thread.java:1559)
com.AzureADLoginService.login(AzureADLoginService.java:33)
org.eclipse.jetty.security.authentication.LoginAuthenticator.login(LoginAuthenticator.java:47)
org.eclipse.jetty.security.authentication.BasicAuthenticator.validateRequest(BasicAuthenticator.java:90)
org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:492)
org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1088)
org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:429)
org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)
org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154)
org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
org.eclipse.jetty.server.Server.handle(Server.java:370)
org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:494)
org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:971)
org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:1033)
org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:644)
org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)
org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
org.eclipse.jetty.io.nio.SslConnection.handle(SslConnection.java:196)
org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:696)
org.eclipse.jetty.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:53)
org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
org.eclipse.jetty.util.thread.QueuedThreadPool.run(QueuedThreadPool.java:543)
java.lang.Thread.run(Thread.java:748)
我写了一个示例 jettey 服务器应用程序,我可以使用 request.getParameter("code")
检索令牌(表单数据中的代码,参考随附的屏幕截图),但它不适用于我的应用程序,有人可以帮我吗?
我使用的是 jetty 8.1.15.v20140411,无法自由升级。
首先,Jetty 8 has been EOL (End of Life) 自 2014 年 11 月以来。
现在,看看你的 Request
状态......
_inputState=1,
_method=GET,
_parameters= {
},
_paramsExtracted=true,
这 4 位告诉我们您的请求...
- 是一个
GET
方法(这不是规范,因为 GET 方法不应该有请求主体)。
inputState
在 1
说一些代码使用 .getInputStream()
将请求正文内容置于 STREAM 模式。
paramsExtracted
表示某段代码使用了各种 .getParameter*()
方法中的一种。
parameters={ }
表示没有从请求查询字符串或请求正文内容中提取或存在任何参数。
建议...
- 首先请确保您对要完成的目标使用了适当的 http 方法,请使用
POST
。
- 确保在您之前没有任何其他代码使用过请求正文内容(例如过滤器)
- 确保您的
application/x-www-form-urlencoded
正文内容正确且没有编码错误! (Jetty 8 宽松得多,但这种宽松使其容易受到许多安全问题的影响。Jetty 9 非常严格)
如果您可以调试实时场景,请在 org.eclipse.jetty.server.Request.getParameters()
上设置一个断点并跟随其执行操作。
我正在尝试向现有码头应用程序添加 Azure AD 身份验证支持。我被重定向到我的应用程序 post 使用 Azure AD 进行身份验证,请求看起来像这样
我的请求转储 object 看起来像
org.eclipse.jetty.server.Request@46b8a08d[
_async=org.eclipse.jetty.server.AsyncContinuation@26bb9274@DISPATCHED,
initial,
_asyncSupported=true,
_attributes= {
javax.servlet.request.key_size=128,
javax.servlet.request.cipher_suite=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
javax.servlet.request.ssl_session_id=5cAbFe3eCbFfA8Ca84A546Cb995105F012E83eD556A493E55973F5A074A91eE3
},
_authentication=<null>,
_baseParameters= {
},
_characterEncoding=<null>,
_connection=AsyncHttpConnection@b7de4c,
g=HttpGenerator {
s=0,
h=-1,
b=-1,
c=-1
},
p=HttpParser {
s=-5,
l=5,
c=0
},
r=1,
_context=ServletContext@o.e.j.s.ServletContextHandler {
/,
null
},
_newContext=false,
_contextPath=,
_cookies=<null>,
_cookiesExtracted=false,
_dispatcherType=REQUEST,
_dns=false,
_endp=SSL NOT_HANDSHAKING i/o/u=0/0/0 ishut=false oshut=false {
AsyncHttpConnection@b7de4c,
g=HttpGenerator {
s=0,
h=-1,
b=-1,
c=-1
},
p=HttpParser {
s=-5,
l=5,
c=0
},
r=1
},
_handled=false,
_inputState=1,
_method=GET,
_parameters= {
},
_paramsExtracted=true,
_pathInfo=<null>,
_port=0,
_protocol=HTTP/1.1,
_queryEncoding=<null>,
_queryString=<null>,
_reader=<null>,
_readerEncoding=<null>,
_remoteAddr=<null>,
_remoteHost=<null>,
_requestAttributeListeners=<null>,
_requestedSessionId=<null>,
_requestedSessionIdFromCookie=false,
_requestURI=<null>,
_savedNewSessions=<null>,
_scheme=https,
_scope=org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher-142075f1,
_serverName=<null>,
_servletPath=/token,
_session=<null>,
_sessionManager=<null>,
_timeStamp=1554775615151,
_dispatchTime=0,
_timeStampBuffer=<null>,
_uri=/token,
_multiPartInputStream=<null>
]
我尝试遍历 header 和属性,但在 header 中只得到 Connection
,在属性
javax.servlet.request.key_size, javax.servlet.request.cipher_suite, javax.servlet.request.ssl_session_id
我的通话记录看起来像
java.lang.Thread.getStackTrace(Thread.java:1559)
com.AzureADLoginService.login(AzureADLoginService.java:33)
org.eclipse.jetty.security.authentication.LoginAuthenticator.login(LoginAuthenticator.java:47)
org.eclipse.jetty.security.authentication.BasicAuthenticator.validateRequest(BasicAuthenticator.java:90)
org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:492)
org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1088)
org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:429)
org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)
org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154)
org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
org.eclipse.jetty.server.Server.handle(Server.java:370)
org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:494)
org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:971)
org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:1033)
org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:644)
org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)
org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
org.eclipse.jetty.io.nio.SslConnection.handle(SslConnection.java:196)
org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:696)
org.eclipse.jetty.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:53)
org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
org.eclipse.jetty.util.thread.QueuedThreadPool.run(QueuedThreadPool.java:543)
java.lang.Thread.run(Thread.java:748)
我写了一个示例 jettey 服务器应用程序,我可以使用 request.getParameter("code")
检索令牌(表单数据中的代码,参考随附的屏幕截图),但它不适用于我的应用程序,有人可以帮我吗?
我使用的是 jetty 8.1.15.v20140411,无法自由升级。
首先,Jetty 8 has been EOL (End of Life) 自 2014 年 11 月以来。
现在,看看你的 Request
状态......
_inputState=1,
_method=GET,
_parameters= {
},
_paramsExtracted=true,
这 4 位告诉我们您的请求...
- 是一个
GET
方法(这不是规范,因为 GET 方法不应该有请求主体)。 inputState
在1
说一些代码使用.getInputStream()
将请求正文内容置于 STREAM 模式。paramsExtracted
表示某段代码使用了各种.getParameter*()
方法中的一种。parameters={ }
表示没有从请求查询字符串或请求正文内容中提取或存在任何参数。
建议...
- 首先请确保您对要完成的目标使用了适当的 http 方法,请使用
POST
。 - 确保在您之前没有任何其他代码使用过请求正文内容(例如过滤器)
- 确保您的
application/x-www-form-urlencoded
正文内容正确且没有编码错误! (Jetty 8 宽松得多,但这种宽松使其容易受到许多安全问题的影响。Jetty 9 非常严格)
如果您可以调试实时场景,请在 org.eclipse.jetty.server.Request.getParameters()
上设置一个断点并跟随其执行操作。