Java 找不到CSRF令牌

Java 找不到CSRF令牌,java,xml,spring,jsp,Java,Xml,Spring,Jsp,我正在学习关于spring security的教程,目前为止我有以下内容: 当我尝试从登录页面登录时,出现以下错误: HTTP状态403-未找到预期的CSRF令牌。您的会话是否已过期 我在stackoverflow上找到的解决方案指示向表单添加一个隐藏属性,我这样做了。这是属性: <input type="hidden" name="${_csrf.parameterName}" value="{_csrf.token}"/> 空的WebApplicationInitializer

我正在学习关于spring security的教程,目前为止我有以下内容: 当我尝试从登录页面登录时,出现以下错误:

HTTP状态403-未找到预期的CSRF令牌。您的会话是否已过期

我在stackoverflow上找到的解决方案指示向表单添加一个隐藏属性,我这样做了。这是属性:

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

public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer {

}
登录控制器:

    @Controller
public class LoginController {

    @RequestMapping(value="/login", method=RequestMethod.GET)
    public String loginPage(ModelMap map){

        //prefix: /WEB-INF/view
        //postfix .jsp
        //prefix + view + postfix
        // /WEB-INF/view/login.jsp
        return "login";

    }
这是我的application-config.xml中的代码

<context:component-scan
        base-package="com.springsecurityexample"/>

这是我的mvc-config.xml文件中的代码:

<context:component-scan
        base-package="com.springsecurityexample.web"/> 


<mvc:annotation-driven />

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- Example: a logical view name of 'showMessage' is mapped to '/WEB-INF/jsp/showMessage.jsp' -->
        <property name="prefix" value="/WEB-INF/view/"/>
        <property name="suffix" value=".jsp"/>
</bean>
<display-name>SpringSecurityTut1</display-name>

   <!--
        - Location of the XML file that defines the root application context.
        - Applied by ContextLoaderListener.
    -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring/application-config.xml</param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>


    <!--
        - Servlet that dispatches request to registered handlers (Controller implementations).
    -->
    <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/mvc-config.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

和我的web.xml文件:

<context:component-scan
        base-package="com.springsecurityexample.web"/> 


<mvc:annotation-driven />

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- Example: a logical view name of 'showMessage' is mapped to '/WEB-INF/jsp/showMessage.jsp' -->
        <property name="prefix" value="/WEB-INF/view/"/>
        <property name="suffix" value=".jsp"/>
</bean>
<display-name>SpringSecurityTut1</display-name>

   <!--
        - Location of the XML file that defines the root application context.
        - Applied by ContextLoaderListener.
    -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring/application-config.xml</param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>


    <!--
        - Servlet that dispatches request to registered handlers (Controller implementations).
    -->
    <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/mvc-config.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>
SpringSecurityTut1
上下文配置位置
类路径:spring/application-config.xml
org.springframework.web.context.ContextLoaderListener
调度员服务
org.springframework.web.servlet.DispatcherServlet
上下文配置位置
/WEB-INF/mvc-config.xml
1.
调度员服务
/
也许您需要
因为



这是一个简单的错误,花了我一整天的时间。在登录和索引页面中,我忘记了赋值中的“$”

我有value=“{u csrf.token}” 而不是value=“${u csrf.token}”


就这样。一个丢失的美元符号!!感谢所有的输入人员。

据我所知,关于Java配置,您不必在public void configure方法中添加CSRF token参数。在视频中,导师没有添加。你会怎么做呢。我愿意试试。看看Spring安全文档,而不是抱怨导师没有它。下面wpj给出的答案也是正确的。我确实查阅了Spring文档,它和导师的一样。wpj的答案不起作用,一旦我解决了真正的问题,它就引发了另一个问题。导师的解决方案有效,因此我对导师的观察是有效的。无论如何,这是一个拼写错误。我忘了价值分配表中的美元。顺便说一句,我知道了如何在configure方法中添加CSRF令牌,并且成功了。尽管如此,即使我没有添加令牌,它也能工作。看起来,这是因为Spring4和更高版本会自动启用令牌。谢谢你的输入。我试过了,消息从:HTTP状态403-未找到预期的CSRF令牌。您的会话是否已过期?所以我还是被卡住了。To:HTTP状态403-在请求参数“\u CSRF”或标头“X-CSRF-Token”上发现无效的CSRF令牌“{u CSRF.Token}”。遗漏导致了原始问题。我漏掉了第二块钱。一旦修复了遗漏错误,使用似乎会导致onClick事件无法注册。尽管如此,这个遗漏还是解决了我原来的问题。谢谢你的意见。
<display-name>SpringSecurityTut1</display-name>

   <!--
        - Location of the XML file that defines the root application context.
        - Applied by ContextLoaderListener.
    -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring/application-config.xml</param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>


    <!--
        - Servlet that dispatches request to registered handlers (Controller implementations).
    -->
    <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/mvc-config.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

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