最近在搞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);
相关推荐
在某些情况下,开发者可能需要将已有的 Python 代码转换为 Java 代码,以适应特定项目的需求。"python转java"这个主题就涉及到这样的需求。 Python 到 Java 的转换并不总是直接的,因为两者的语法规则、类型系统...
Python库`pypsr`提供了相空间重构的功能,使得非线性信号处理和混沌分析变得更加方便。在本篇文章中,我们将深入探讨Python在相空间重构中的应用以及`pypsr`库的核心功能。 首先,让我们理解什么是相空间重构。在...
- Python中动态类型在代码重构时可能会引发问题,但可以通过编写测试用例和使用描述符等技术来减少风险。 10. Java特有的编程概念: - Java中的强类型系统、异常处理机制、泛型检查等设计原则有助于减少编程错误。 ...
项目标题:《深入Python设计模式:原理与实践的重构之旅》 项目概述: 本项目致力于探索和学习Python中的设计模式,通过实际的代码重构来深化理解。项目包含35个文件,主要以Python语言编写,同时涉及Java语言的一...
本文将详细介绍一个基于Python实现的高级代码补全工具,该工具专注于为Python、Java和C++等编程语言提供高质量的代码补全功能。 首先,我们要理解什么是代码补全。代码补全,也被称为自动完成或智能提示,是一种...
PyCharm的使用则能让编程体验更加顺畅,同时,了解JDK的作用有助于应对涉及Java的Python项目。 在实际开发过程中,Python常被用于数据分析、机器学习、Web开发、自动化脚本等领域。PyCharm的特性如代码分析、重构、...
基于以上信息,可以预期这份文档可能涵盖以下Java重构和代码优化的知识点: 1. 重构的基本原则:理解何时应该重构,以及重构的目的,如提升代码可读性、减少复杂性、提高性能等。 2. 重构的步骤:包括识别代码坏...
4. **重构**: 提供了Python代码的重构工具,如重命名、提取方法、内联变量等,帮助保持代码整洁。 5. **集成PyLint**: PyDev集成了静态代码分析工具PyLint,可以在编码时即时检查代码质量,提供代码风格改进建议。 6...
Eclipse,另一方面,是一个广泛使用的开源集成开发环境(IDE),最初主要用于Java开发,但现在通过插件支持多种编程语言,包括Python。Eclipse 提供了代码编辑、调试、版本控制、构建自动化等多方面的功能,使得开发...
Eclipse是一款广受欢迎的开源集成开发环境(IDE),主要用于Java开发,但它也支持其他编程语言,包括Python。在Eclipse中开发Python项目,通常需要安装专门的插件,PyDev就是其中最为著名的一个。PyDev是由Fernando ...
选择“文件”> “新建”> “PyDev Project”,输入项目名称,选择项目类型(如普通Python项目或PyDev Django项目),然后点击“完成”。 6. **编写代码**: 创建项目后,右键点击项目,选择“新建”> “Python File...
创建项目后,就可以在Eclipse中开始编写Python代码,并利用Eclipse提供的各种功能来开发和调试Python程序。 在整个开发环境搭建过程中,需要注意的是,系统变量配置是否正确,JDK版本是否与Eclipse版本兼容,以及...
6. Jython和IronPython支持:除了Python,PyDev还支持Jython(Python在Java平台上的实现)和IronPython(Python在.NET平台上的实现)。 三、集成开发环境的优化 1. PyDev透视图:专门针对Python开发的视图布局,...
Eclipse的Java编辑器支持代码高亮、自动补全(Code Completion)、代码模板、重构等高级功能。 Eclipse也支持团队协作。它内置了对CVS和SVN的支持,开发者可以将代码存储在版本控制系统中。它还提供了代码审查工具...
Python Eclipse 插件是开发Python项目的一个强大工具,它为Eclipse这个流行的Java IDE增添了对Python语言的支持。通过集成Python开发环境,Eclipse用户能够享受到诸如代码编辑、调试、重构和版本控制等一系列便利...
10. **集成开发环境**:IDEA的其他强大功能,如代码导航、重构、代码审查等,都可应用于Python项目。 安装Python插件的方法非常简单,只需要在IDEA的插件市场中搜索"Python",然后点击安装并重启IDEA即可。对于初学...
Eclipse是一款广泛使用的开源集成开发环境(IDE),它支持多种编程语言,包括Java、C++、PHP等。然而,对于Python开发者来...通过正确安装和配置,Eclipse可以成为一个强大的Python IDE,满足各种复杂项目的开发需求。
Eclipse是一款广泛使用的Java IDE,但通过安装Python for Eclipse插件,开发者可以使用Eclipse编写、调试和管理Python项目。插件提供了代码补全、语法高亮、错误检查、重构工具、调试器以及对Python虚拟环境的支持,...
PyDev 2.7是该插件的一个旧版本,它包含了调试、代码补全、语法高亮、重构等功能,为Python开发者提供了一流的开发体验。虽然PyDev有更先进的版本,但在MyEclipse 10中使用2.7版本可以确保与该IDE的兼容性。 要在...
Eclipse是一款广泛使用的开源集成开发环境(IDE),最初主要用于Java编程,但随着时间的推移,它已经发展成为一个多语言平台,支持包括Python在内的多种编程语言。"eclipse中的python插件"指的是在Eclipse中安装特定...