`
sls0919
  • 浏览: 123107 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

python项目java重构各种问题

阅读更多

最近在搞python项目用java重构,出现了各种问题,记录如下:

1 post请求失败,报csrf错误

   错误日志:

018-07-30 10:46:51.568 ERROR 24753 --- [nio-7001-exec-2] ssDeniedHandlerLoggingMethodBeforeAdvice : To access request URI [/warehouseItem/importWarehouseSku.json] is denied , 
caused by : Invalid CSRF Token 'null' was found on the request parameter '_csrf' or header 'X-XSRF-TOKEN'.
 出现问题原因为:spring-security组件从3升级到4后修改了安全验证,将post排除在外了。

 

   修复方案:application.properties文件

   方法1:关闭post的csrf校验

security.enableCsrf = false
spring.security.csrf.supportedMethods = PUT

 

   方法2:根据黑名单关闭csrf校验

spring.security.csrf.url.style = regex
spring.security.csrf.url.included = /.*?
spring.security.csrf.url.excluded = ^/csrf/nocheck

 

2 响应头信息有set-cookie返回

  这个也是spring-security安全组件导致的。关闭csrf后就可以了

 

3 url中有特殊字符串请求报错400

  详细报错信息如下:

   

2019-7-30 10:29:15 org.apache.coyote.http11.AbstractHttp11Processor process
信息: Error parsing HTTP request header
 Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.
java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
	at org.apache.coyote.http11.InternalAprInputBuffer.parseRequestLine(InternalAprInputBuffer.java:238)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1028)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
	at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2555)
	at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2544)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:662)

 

 

   3.1 tomcat项目

       这是因为新版tomcat(Tomcat在 7.0.73, 8.0.39, 8.5.7 版本后,添加了对于http头的验证。)严格按照RFC 3986规范进行访问解析,而 RFC 3986规范定义了Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符(RFC3986中指定了以下字符为保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ]), 如果传入参数有{}或|就会报错,我是由于代码中有|导致报错

 

      3.1.1 解决方案一

               

在conf/catalina.properties中最后添加2行

tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true

           这个地方只能配置|、{、} 允许这三个字符,对于其他的(例如" < > [ \ ] ^ ` { | } .),在请求时,仍然拦截,如果使用了|{}之外的其他字符那怎么办呢?那就还需要如下配置。

 

在conf/server.xml中的<Connector>节点中,添加2个属性:

        

relaxedPathChars="|{}[],"
relaxedQueryChars="|{}[],"

 

 

      3.1.2 解决方案二

               降级tomcat,使用低版本就不会出现这个问题了

      3.1.3 解决方案三

               请求方再有特殊字符的参数时要做urlencode。或者改为post请求,参数放body中

 

   3.2 spring-boot项目

         出问题其实也是tomcat导致的,由于spring-boot启用内置的tomcat导致。

         

  • 解决方案一

          

需要在tomcat的配置文件中设置

org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true

tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}

更直接的方法是在JVM启动参数中添加
-Dtomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
-Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true

post请求避免options
请求头的  content-type 设置为  application/x-www-form-urlencoded 

如果是sh配置文件启动方式需要增加参数:
SERVICE_OPTS="${SERVICE_OPTS} -Dtomcat.util.http.parser.HttpParser.requestTargetAllow=\"|{}\""
SERVICE_OPTS="${SERVICE_OPTS} -Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true"

 

     另一种解决方案:

     springboot从1.4.7.RELEASE. 升级到 1.5.14.RELEASE后,遇到了embedded Tomcat中对URI的校验规则限制,导致URL中含有“{}”等字符的GET请求出现400响应;最后通过定制connector的 'relaxedQueryChars'属性才解决<br>connector.setAttribute("relaxedQueryChars", "[\]^`{|}");

详细请参考:https://stackoverflow.com/questions/51703746/setting-relaxedquerychars-for-embedded-tomcat

 

4 spring-boot请求返回template页面

    出现如下报错,但是不影响接口正常使用

   

unable to find resource 'XXX.vm' in any resource loader

 

    解决:spring.velocity.enabled = false

 

 

5  post重定向之后,浏览器重新发起的是get请求

 

(1)浏览器端报CORS policy相关错误

服务端设置 response header参数,解决跨域重定向问题

Access-Control-Allow-Credentials = true
Access-Control-Allow-Origin = request hedaer中的Origin

 

(2)浏览器接到请求后,发起的是GET请求,且原来post请求里的参数全都丢失了

服务端设置返回码修改为307

重定向的代码从

httpResponse.sendRedirect(targetURL);

 

修改为

httpResponse.setStatus(307);
httpResponse.setHeader("Location",targetURL);

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics