web-dev-qa-db-fra.com

Statut HTTP 405 - La méthode de requête 'POST' n'est pas prise en charge dans Spring MVC

J'ai créé une application spring mvc en utilisant un modèle freemarker comme vue. Dans cette tentative d’ajouter un modèle à l’aide de formulaires.

employé.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>

Lorsque vous cliquez sur le bouton d'envoi, l'erreur `

Statut HTTP 405 - La méthode de requête 'POST' n'est pas prise en charge

` J'ai donné la méthode POST sur ftl et sur le contrôleur. Alors pourquoi cela arriverait-il?

14
rohi

Je ne suis pas sûr que cela aide mais j'ai eu le même problème.

Vous utilisez springSecurityFilterChain avec une protection CSRF. Cela signifie que vous devez envoyer un jeton lorsque vous envoyez un formulaire via une demande POST]. Essayez d'ajouter la prochaine entrée à votre formulaire:

<input type="hidden"
name="${_csrf.parameterName}"
value="${_csrf.token}"/>
24
crm86

Pour autant que je sache, les solutions mentionnées ne fonctionnaient pas pour le dernier SpringSecurity. Au lieu de passer par masqué, vous pouvez également l'envoyer via l'URL d'action comme ci-dessous:

<form method="post" action="doUpload?${_csrf.parameterName}=${_csrf.token}" enctype="multipart/form-data">
6
Shahab A

J'ai trouvé la solution. C’est en raison de la sécurité du printemps, de la protection CSRF (Cross Site Request Forgery). Il bloque l'URL. J'ai donc ajouté un champ supplémentaire à l'intérieur du formulaire.

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

Maintenant cela fonctionne correctement.

1
rohi

Essayez de remplacer:

action="addEmployee"

avec:

action="${pageContext.request.contextPath}/addEmployee"

Sauf si vous utilisez Spring 3.2

EDIT après avoir vu XML:

Essayez de déplacer servlet-context.xml vers votre répertoire WEB-INF et renommez-le 'appServlet-context.xml'. Puis supprimez la ligne:

/WEB-INF/spring/appServlet/servlet-context.xml,

À partir de contextConfigLocation dans votre web.xml.

Selon la convention, le fichier XML de contexte s'appelle '[nom du servlet] -context.xml', où [nom du servlet] correspond au nom du DispatcherServlet.

Essayez également d’ajouter un '/' à votre action de formulaire, donc:

action="/addEmployee"
0
Adriaan Koster

Cela fonctionne pour moi:

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

une autre solution (mais chaque forme)

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