CAP JAVA oData:作为ODATA键的字符串会在包含特殊字符时引起问题

2020-08-19 19:38发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


伙计们,

我正在根据SAP CAP实施JAVA应用。 我有一个带字符串键的Odata实体。

实体FavoriteSet {
 键ID:字符串;
 Desc1:字符串;
 Desc2:字串;
 固定:字符串;
 }
 

只要密钥仅包含URL合法字符,一切正常。 但是,一旦我有(URL编码)特殊字符,它就无法工作。 例如。 以下调用返回HTTP 400。

 http://localhost:8080/odata/v4/NAVIGATE_SRV/FavoriteSet('KEY%2FTEST')

但是,根据ODATA v4规范,具有url编码字符的字符串键有效: https://docs.oasis-open.org/odata/odata/v4.01/odata-v4.01-part2-url -conventions.html#sec_URL语法

这是一个错误吗? 还是我错过了什么?

谢谢!

西蒙(Simon)

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


伙计们,

我正在根据SAP CAP实施JAVA应用。 我有一个带字符串键的Odata实体。

实体FavoriteSet {
 键ID:字符串;
 Desc1:字符串;
 Desc2:字串;
 固定:字符串;
 }
 

只要密钥仅包含URL合法字符,一切正常。 但是,一旦我有(URL编码)特殊字符,它就无法工作。 例如。 以下调用返回HTTP 400。

 http://localhost:8080/odata/v4/NAVIGATE_SRV/FavoriteSet('KEY%2FTEST')

但是,根据ODATA v4规范,具有url编码字符的字符串键有效: https://docs.oasis-open.org/odata/odata/v4.01/odata-v4.01-part2-url -conventions.html#sec_URL语法

这是一个错误吗? 还是我错过了什么?

谢谢!

西蒙(Simon)

付费偷看设置
发送
2条回答
黑丝骑士
1楼-- · 2020-08-19 20:41

西蒙,你好

具有特殊字符的网址在olingo库中运行良好。

能否请您分享获得的堆栈跟踪信息?

您还使用哪个版本的CAP?

此致

Ramya

木偶小白
2楼-- · 2020-08-19 20:27

嗨Ramya,

感谢您的回复。 我实际上注意到问题仅在于'/'(斜杠)。 上面提到的调用返回HTTP 400(错误请求),因此没有错误堆栈跟踪。 任何其他带有特殊字符的示例都可以使用。

然后我发现也许我不得不对斜杠进行两次编码,所以它变成%252F(而不是%2F)。

现在返回未经授权的401。 并且有堆栈跟踪

 org.springframework.security.web.firewall.RequestRejectedException:请求被拒绝,因为URL包含潜在的恶意字符串"%25"
 在org.springframework.security.web.firewall.StrictHttpFirewall.rejectedBlacklistedUrls(StrictHttpFirewall.java:369)〜[spring-security-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
 在org.springframework.security.web.firewall.StrictHttpFirewall.getFirewalledRequest(StrictHttpFirewall.java:336)〜[spring-security-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
 在org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:194)〜[spring-security-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
 在org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178)〜[spring-security-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
 在org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358)〜[spring-web-5.2.4.RELEASE.jar:5.2.4.RELEASE]
 在org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271)〜[spring-web-5.2.4.RELEASE.jar:5.2.4.RELEASE]
 在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)〜[tomcat-embed-core-9.0.31.jar:9.0.31]
 在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)〜[tomcat-embed-core-9.0.31.jar:9.0.31]
 在org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)〜[spring-web-5.2.4.RELEASE.jar:5.2.4.RELEASE]
 在org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)〜[spring-web-5.2.4.RELEASE.jar:5.2.4.RELEASE]
 在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)〜[tomcat-embed-core-9.0.31.jar:9.0.31]
 在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)〜[tomcat-embed-core-9.0.31.jar:9.0.31]
 在org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)〜[spring-web-5.2.4.RELEASE.jar:5.2.4.RELEASE]
 在org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)〜[spring-web-5.2.4.RELEASE.jar:5.2.4.RELEASE]
 在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)〜[tomcat-embed-core-9.0.31.jar:9.0.31]
 在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)〜[tomcat-embed-core-9.0.31.jar:9.0.31]
 在org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)〜[spring-web-5.2.4.RELEASE.jar:5.2.4.RELEASE]
 在org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)〜[spring-web-5.2.4.RELEASE.jar:5.2.4.RELEASE]
 在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)〜[tomcat-embed-core-9.0.31.jar:9.0.31]
 在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)〜[tomcat-embed-core-9.0.31.jar:9.0.31]
 在org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)〜[tomcat-embed-core-9.0.31.jar:9.0.31]
 在org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)[tomcat-embed-core-9.0.31.jar:9.0.31]
 在org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)[tomcat-embed-core-9.0.31.jar:9.0.31]
 在org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)[tomcat-embed-core-9.0.31.jar:9.0.31]
 在org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)[tomcat-embed-core-9.0.31.jar:9.0.31]
 在org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)[tomcat-embed-core-9.0.31.jar:9.0.31]
 在org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)[tomcat-embed-core-9.0.31.jar:9.0.31]
 在org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:367)上[tomcat-embed-core-9.0.31.jar:9.0.31]
 在org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)上[tomcat-embed-core-9.0.31.jar:9.0.31]
 在org.apache.coyote.AbstractProtocol $ ConnectionHandler.process(AbstractProtocol.java:868)[tomcat-embed-core-9.0.31.jar:9.0.31]
 在org.apache.tomcat.util.net.NioEndpoint $ SocketProcessor.doRun(NioEndpoint.java:1639)[tomcat-embed-core-9.0.31.jar:9.0.31]
 在org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)上[tomcat-embed-core-9.0.31.jar:9.0.31]
 在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)[na:1.8.0_192]
 在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:624)[na:1.8.0_192]
 在org.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run(TaskThread.java:61)[tomcat-embed-core-9.0.31.jar:9.0.31]
 在java.lang.Thread.run(Thread.java:748)[na:1.8.0_192]
 

所以我想知道是否可能由于安全问题而拒绝了"/"...

这些是我的版本:

 <!-SAP Cloud SDK->
         <依赖性>
                  com.sap.cloud.sdk 
                  sdk-modules-bom 
                  3.18.0 
                  pom 
                 导入
         

 <!-CDS服务/盖帽->
 <依赖性>
  com.sap.cds 
  cds-services-bom 
  1.4.0 
  pom 
 导入
  

再次感谢您!

西蒙(Simon)

一周热门 更多>