我正在学习Spring框架,我正在使用xml配置文件来实现安全性:
user-service-ref="jdbcUserService"
remember-me-parameter="remember-me" token-validity-seconds="1209600" />
并以我的登录表格:
method='POST'>
User: | |
Password: | |
Remember Me | |
value="Login" /> |
value="${_csrf.token}" />
但是在我登录并经过一段时间后(我在web.xml中将会话超时设置为1分钟)我在浏览器中收到此错误:
无法验证提供的CSRF令牌,因为找不到您的会话.
到目前为止,我找不到任何仅使用xml文件进行配置的帖子.这都是关于使用java进行配置的,其他一些答案建议在登录表单中包含csrf隐藏输入,我已经这样做了.知道如何解决这个问题吗?
P.S:web.xml文件如下所示:
< web-app xmlns:xsi =“http://www.w3.org/2001/XMLSchema-instance”xmlns =“http://xmlns.jcp.org/xml/ns/javaee”xsi:schemaLocation =“ http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd“id =”WebApp_ID“version =”3.1“>
弹簧教程-51< /显示名称>
< description> Spring教程网络应用< / description>
<欢迎-文件列表>
<欢迎-文件>&index.html的LT /欢迎-文件>
<欢迎-文件>&的index.htm LT; /欢迎-文件>
<欢迎-文件>&的index.jsp LT; /欢迎-文件>
<欢迎-文件>&default.html中LT; /欢迎-文件>
<欢迎-文件>&的Default.htm LT; /欢迎-文件>
<欢迎-文件>&的Default.jsp LT; /欢迎-文件>
< /欢迎-文件列表>
< servlet的>
<描述>< /描述>
&报价LT; /显示名称>
< servlet的名称>&报价LT; / servlet的名称>
< servlet的类> org.springframework.web.servlet.DispatcherServlet< / servlet的类>
<负载上启动→1< /负载上启动>
< / servlet的>
< servlet的映射>
< servlet的名称>&报价LT; / servlet的名称>
< URL模式> /< / url-pattern的>
< / servlet的映射>
<资源引用>
< description>数据库连接< / description>
< RES-REF-名称>的JDBC / springtutorial< / RES-REF-名称>
< RES型> javax.sql.DataSource中< / RES型>
< RES-AUTH>集装箱< / RES-AUTH>
< /资源引用>
<听者GT;
<监听级> org.springframework.web.context.ContextLoaderListener< /监听级>
< /收听GT;
<的context-param>
< PARAM-名称>的contextConfigLocation< / PARAM-名称>
< PARAM值>
类路径:COM / myproject的/春/网络/配置/道的context.xml
类路径:COM / myproject的/春/网络/配置/服务的context.xml
类路径:COM / myproject的/春/网络/配置/安全的context.xml
< / PARAM值>
< /的context-param>
<滤光器>
&springSecurityFilterChain LT; /显示名称>
<过滤器名称>&springSecurityFilterChain LT; /过滤器名称>
<滤波器级> org.springframework.web.filter.DelegatingFilterProxy< /滤波器级>
< /滤光器>
<过滤器映射>
<过滤器名称>&springSecurityFilterChain LT; /过滤器名称>
< URL模式> / *< / url-pattern的>
< /过滤器映射>
<会话配置>
<会话超时→1< /会话超时>
< /会话配置>
< / web应用程序>
我将以下配置添加到我的安全配置文件中.
我将此添加到我的security-context.xml,这是一个安全配置文件.
user-service-ref="jdbcUserService"
remember-me-parameter="remember-me" token-validity-seconds="1209600" />
我希望令牌在1分钟后有效,持续1209600秒.
解决方法:
我不明白这里令人惊讶的部分在哪里?你之前这么说
I set the session timeout to be 1 minute in the web.xml
除了会话之外,服务器还可以存储其CSRF令牌的副本吗?因此,当您的会话在一分钟内到期时,服务器无法找到其副本以匹配您的请求中的CSRF令牌并引发此类异常.
因此,要解决此问题,只需增加会话超时. (对我来说只有1分钟的超时时间看起来非常严格.即使在“安全”的地方,我也没有看到现实生活中不到10分钟的任何事情.通常更多.)
标签:java,spring
来源: https://codeday.me/bug/20190522/1154503.html