我有一个SPRING 4应用程序。它使用Spring Security Ldap身份验证进行身份验证。一切正常,但是当我尝试发出POST请求时,它无法给我一个 WARN:org.springframework.web.servlet.PageNotFound - 请求方法' POST'不受支持。
我正在尝试使用我的脚本中的curl命令执行post请求,该命令会触发控制器的POST方法并上传文件。
spring-security.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:security="http://www.springframework.org/schema/security"
xsi:schemaLocation="http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<security:http auto-config="true" use-expressions="true">
<security:intercept-url pattern="/login" access="permitAll()" />
<security:intercept-url pattern="/info" access="permitAll()" method="GET" />
<security:intercept-url pattern="/bookings" access="isAuthenticated()" method="POST"/>
<security:intercept-url pattern="/chartdata" access="isAuthenticated()" method="GET" />
<security:intercept-url pattern="/uploadData/*" access="isAuthenticated()" method="POST"/> <!-- Change2 -->
<security:intercept-url pattern="/**" access="isAuthenticated()" />
<security:form-login login-page="/login"
login-processing-url="/performLogin"
authentication-failure-url="/login?error=true" />
<access-denied-handler error-page="/login" />
</security:http>
<security:authentication-manager alias="authenticationManager">
<security:ldap-authentication-provider user-dn-pattern="uid={0}, ou=People,o=XXX" />
</security:authentication-manager>
<ldap-server url="ldap://ldap.xxx.com/dc=xxx,dc=com" port="389" />
</beans:beans>
Controller.java
@RequestMapping(value = "/uploadData/{type}****?${_csrf.parameterName}=${_csrf.token}****", headers = {"Accept=*/*","enctype=multipart/form-data"}, method = {RequestMethod.POST, RequestMethod.GET }, consumes="*/*")
public String uploadData_type( //
@PathVariable("type") final String type, //
@RequestParam("theDate") final String theDate, //
@RequestParam("data") final MultipartFile theFile //
) {
String status_message = null;
Tracking.message("Importing '%s' file: '%s'", type, theFile.getOriginalFilename());
..........
}
类型,一旦脚本执行curl调用,就会从脚本传递日期和数据。
脚本代码:
#!/bin/bash
SILENT=--silent
THIS_SCRIPT=${0##*/}
FILETYPE=$1
theFile=$2
theFileName=${theFile##*/}
theDate=${theFileName##*.}
URL="http://localhost:8080/gds-report/uploadData/$FILETYPE"
msg=$(curl $SILENT -X POST -F "data=@$theFile" -F "theDate=$theDate" -F "filename=$theFileName" -H "Content-Type: multipart/form-data" "$URL")
echo -n $THIS_SCRIPT:
if [ -z "$msg" ] ; then
echo "Results - no message received"
exit 1
else
echo "Results: $msg"
fi
我尝试过在stackoverflow上找到的2个解决方案: 1)编辑并尝试在请求中传递csrf参数或更改禁用csrf的方法类型。但是,没有运气,它总是给我一个405错误。 2)在我的app-servlet.xml文件中添加这个bean,允许上传大文件。
<beans:bean id="multipartResover"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<beans:property name="maxUploadSize" value="2000000">
</beans:property>
</beans:bean>
我尝试使用curl for windows调试,POSTMAN也给出了同样的错误。我在任何文档上都找不到更多相关信息。有人可以请求帮助,我认为这是我想念的非常小的事情。
POSTMAN ERROR OUTPUT下面显示了允许:GET 标题,即使我请求使用POST方法并且响应标头只允许:GET,我也不明白它为什么出现。
Allow → GET
Cache-Control → no-cache, no-store, max-age=0, must-revalidate
Content-Language → en
Content-Length → 1090
Content-Type → text/html;charset=ISO-8859-1
Date → Thu, 25 Feb 2016 08:54:26 GMT
Expires → 0
Pragma → no-cache
Server → Apache-Coyote/1.1
X-Content-Type-Options → nosniff
X-Frame-Options → DENY
X-XSS-Protection → 1; mode=block
注意:Controller中的GET请求已成功完成。只是POST根本不工作。请给我一些建议。 Spring 4. Java 8 Tomcat 8。
答案 0 :(得分:0)
这里可能有两件事:您的防火墙规则可能会阻止后期操作本身,在这种情况下,您可以编写新的异常(或者在没有防火墙的情况下尝试检查)。另一种可能性是路由器本身可能会阻止请求,就好像流量被视为&#34;服务器一样的行为&#34;可能需要将端口转发异常写入路由器。
答案 1 :(得分:0)
<http>
和<intercept-url>
规则,并使用security.xml文件中的<csrf disabled:true>
关闭CSRF。