HTTP Status 405 – Richiesta di metodo “POST” non supportato in Spring MVC, con Molla di Sicurezza

Ho creato un framework spring mvc applicazione che utilizza freemarker modello di vista di parte. In questo tentativo di aggiungere un modello utilizzando il form.Sto usando la molla di sicurezza
Qui è il codice

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

Quando fare clic sul pulsante submit restituisce errore `

Di Stato HTTP 405 – metodo di Richiesta di ‘POST’ non supportato

`
Ho dato metodo POST su entrambe le ftl e controller. Allora perché questo accada?

  • Che Primavera versione stai usando?
  • Puoi dimostrare la tua web.xml?
  • ho aggiornato la mia domanda
InformationsquelleAutor rohi | 2014-12-03



5 Replies
  1. 24

    Non so se questo aiuta, ma ho avuto lo stesso problema.

    Si utilizza springSecurityFilterChain con protezione CSRF. Che significa che è necessario inviare un token quando si invia un modulo tramite richiesta POST. Tenta di aggiungere il successivo ingresso al modulo:

    <input type="hidden"
    name="${_csrf.parameterName}"
    value="${_csrf.token}"/>
    • Che risolvere una parte del problema, ma hai studiato perché manca un Token CSRF si traduce in un “405 Richiesta metodo “POST” non supportato” invece di un 403?
  2. 6

    Per quanto ho visto, le soluzioni citate non lavoro per le ultime SpringSecurity. Invece di passare attraverso nascosto, è inoltre possibile inviare attraverso l’URL di azione come di seguito:

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

    Ho trovato la soluzione. È a causa di spring security Cross Site Request Forgery (CSRF) di protezione. Blocca gli url. Così ho aggiunto un campo all’interno del modulo.

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

    Ora funziona correttamente.

    • Così si dovrebbe accettare prm risposta, giusto?
    • non ho alcun preavviso la sua risposta. L’ho trovato prima di pubblicare la sua risposta. Ma Comunque ora ho accettato la sua risposta.
  4. 0

    Provare a sostituire:

    action="addEmployee"

    con:

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

    A meno che non si utilizza Primavera 3.2

    EDIT dopo aver visto XML:

    Provare a spostare servlet-context.xml per la vostra directory WEB-INF e rinominarlo ‘appServlet-context.xml’. Quindi rimuovere la riga:

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

    Dal contextConfigLocation nel web.xml.

    La convenzione è che il contesto file xml denominato ‘[servlet-name]-context.xml ” dove [servlet-name] è il nome del DispatcherServlet.

    Anche provare ad aggiungere un ‘/’ per l’action della form, in modo da:

    action="/addEmployee"
    • Sto usando la versione primaverile 3.2.3
  5. 0

    Questo funziona per me:

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

    un’altra soluzione (ma ogni forma)

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

Lascia un commento