Ich habe eine Spring-MVC-Anwendung mit Freemarker-Vorlage als Ansichtsteil erstellt. In diesem Versuch wurde versucht, ein Modell mithilfe von Formularen hinzuzufügen. Ich verwende auch die Federsicherheit
<fieldset>
<legend>Add Employee</legend>
<form name="employee" action="addEmployee" method="post">
Firstname: <input type="text" name="name" /> <br/>
Employee Code: <input type="text" name="employeeCode" /> <br/>
<input type="submit" value=" Save " />
</form>
@RequestMapping(value = "/addEmployee", method = RequestMethod.POST)
public String addEmployee(@ModelAttribute("employee") Employee employee) {
employeeService.add(employee);
return "employee";
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://Java.Sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://Java.Sun.com/xml/ns/javaee http://Java.Sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- Spring MVC -->
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spring/appServlet/servlet-context.xml,
/WEB-INF/spring/springsecurity-servlet.xml
</param-value>
</context-param>
<!-- Spring Security -->
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.2.xsd">
<http security="none" pattern="/resources/**"/>
<!-- enable use-expressions -->
<http auto-config="true" use-expressions="true">
<intercept-url pattern="/login" access="isAnonymous()"/>
<intercept-url pattern="/**" access="hasRole('ROLE_ADMIN')" />
<!-- access denied page -->
<access-denied-handler error-page="/403" />
<form-login
login-page="/login"
default-target-url="/"
authentication-failure-url="/login?error"
username-parameter="username"
password-parameter="password" />
<logout logout-success-url="/login?logout" />
<!-- enable csrf protection -->
<csrf />
</http>
<authentication-manager>
<authentication-provider user-service-ref="userDetailsService" >
<password-encoder hash="bcrypt" />
</authentication-provider>
</authentication-manager>
</beans:beans>
Wenn Sie auf die Schaltfläche "Senden" klicken, wird der Fehler `angezeigt
HTTP-Status 405 - Anforderungsmethode 'POST' wird nicht unterstützt
` Ich habe POST Methode sowohl für FTP als auch für Controller angegeben. Warum sollte das passieren?
Ich bin nicht sicher, ob das hilft, aber ich hatte das gleiche Problem.
Sie verwenden springSecurityFilterChain mit CSRF-Schutz. Das bedeutet, dass Sie ein Token senden müssen, wenn Sie ein Formular über die Anforderung POST senden. Versuchen Sie, die nächste Eingabe zu Ihrem Formular hinzuzufügen:
<input type="hidden"
name="${_csrf.parameterName}"
value="${_csrf.token}"/>
Soweit ich gesehen habe, funktionierten die genannten Lösungen nicht für die neueste SpringSecurity. Anstatt versteckt durchzugehen, können Sie es auch wie folgt über die Aktions-URL senden:
<form method="post" action="doUpload?${_csrf.parameterName}=${_csrf.token}" enctype="multipart/form-data">
Ich habe die Lösung gefunden. Der Cross-Site-Request-Forgery-Schutz (Spring Site Request Forgery, CSRF) ist im Frühjahr sicher. Es blockiert die URL. Also habe ich ein zusätzliches Feld in das Formular eingefügt.
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
Jetzt funktioniert es richtig.
Versuchen Sie zu ersetzen:
action="addEmployee"
mit:
action="${pageContext.request.contextPath}/addEmployee"
Es sei denn, Sie verwenden Spring 3.2
BEARBEITEN, nachdem Sie XML gesehen haben:
Verschieben Sie servlet-context.xml in Ihr WEB-INF-Verzeichnis und benennen Sie es in "appServlet-context.xml" um. Dann entfernen Sie die Zeile:
/WEB-INF/spring/appServlet/servlet-context.xml,
Aus dem contextConfigLocation in Ihrer web.xml.
Die Konvention ist, dass die XML-Kontextdatei '[Servlet-Name] -context.xml "heißt, wobei [Servlet-Name] der Name des DispatcherServlet ist.
Versuchen Sie auch, Ihrer Formularaktion ein "/" hinzuzufügen.
action="/addEmployee"
Das funktioniert für mich:
.and().csrf().disable();
eine andere Lösung (aber jede Form)
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>