我有两个元数据(我使用的是百里香):
<meta name="_csrf" th:content="${_csrf.token}" />
<meta name="_csrf_header" th:content="${_csrf.headerName}" />
在我的测试控制器中,我这样做:
HttpSessionCsrfTokenRepository httpSessionCsrfTokenRepository = new HttpSessionCsrfTokenRepository();
CsrfToken csrfToken2 = httpSessionCsrfTokenRepository.generateToken(new MockHttpServletRequest());
CustomUser user = new CustomUser();
user.setName("foo");
user.setSurname("fooo");
List<GrantedAuthority> grantedAuthorities = new ArrayList<GrantedAuthority>();
grantedAuthorities.add(new SimpleGrantedAuthority("role"));
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken("foo", "fooo", grantedAuthorities);
token.setDetails(user);
MockHttpSession session = new MockHttpSession();
session.setAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY, new MockSecurityContext(token));
session.setAttribute("_csrf", csrfToken2);
this.mockMvc.perform(post("/foo/update")
.param("param", "asdfasd")
....
.session(session)
)
.andExpect(view().name(("foo/detail"))).andExpect(model().hasErrors())
当我运行测试时,我收到此错误(未找到令牌或为空):
org.springframework.web.util.NestedServletException:请求处理失败;嵌套异常是 org.thymeleaf.exceptions.TemplateProcessingException: 异常评估 SpringEL 表达式: "_csrf.token" (layout/default:4) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:979) at org. springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:869) at javax.servlet.http.HttpServlet.service(HttpServlet.java:707) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java: 843) 在 org.springframework.mock.web.MockFilterChain 的 javax.servlet.http.HttpServlet.service(HttpServlet.java:790) 的 org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:65) $ServletFilterProxy。
我找到了一个临时解决方案,但这不是一个好的解决方案..:
<th:block th:if="${_csrf}">
<meta name="_csrf" th:content="${_csrf.token}" />
<meta name="_csrf_header" th:content="${_csrf.headerName}" />
</th:block>