Java 找不到CSRF令牌
我正在学习关于spring security的教程,目前为止我有以下内容: 当我尝试从登录页面登录时,出现以下错误: HTTP状态403-未找到预期的CSRF令牌。您的会话是否已过期 我在stackoverflow上找到的解决方案指示向表单添加一个隐藏属性,我这样做了。这是属性: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
<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}"/>