it-swarm.com.de

HTTP-Status 405 - Anforderungsmethode 'POST' wird in Spring MVC nicht unterstützt

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

employee.ftl

<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>

employeeController.Java

@RequestMapping(value = "/addEmployee", method = RequestMethod.POST)
    public String addEmployee(@ModelAttribute("employee") Employee employee) {
        employeeService.add(employee);
        return "employee";
    }

web.xml

<?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>

Spring-security.xml

<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?

14
rohi

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}"/>
24
crm86

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">
6
Shahab A

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.

1
rohi

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"
0
Adriaan Koster

Das funktioniert für mich:

.and().csrf().disable();

eine andere Lösung (aber jede Form)

<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
0
Great Michael