我想在此处显示的示例中添加几个测试:
https://spring.io/guides/gs/securing-web/
能够在会话关闭或过期时验证用户是否无法再访问需要身份验证的资源。我想在我的测试中模拟以下两个条件:
a)用户自愿结束会话(例如关闭浏览器);
b)会话超时;
我不知道如何使用MockMvc重现这些条件。
我设法做了以下事情:
@Test
public void sessionIsInvalid() throws Exception {
FormLoginRequestBuilder login = formLogin()
.user("user")
.password("password");
mockMvc.perform(login)
.andExpect(authenticated())
.andDo(mvcResult -> {
MockHttpSession session = (MockHttpSession)mvcResult.getRequest().getSession();
session.invalidate();
mockMvc.perform(get("/hello")
.session(session))
.andExpect(status().isFound());
});
}
......这似乎有效,但我不完全确定invalidate
在这种情况下做了什么,以及它是否符合上述条件a)。
为了模拟会话超时,我完成了:
@Test
public void sessionExpires() throws Exception {
FormLoginRequestBuilder login = formLogin()
.user("user")
.password("password");
mockMvc.perform(login)
.andExpect(authenticated())
.andDo(mvcResult -> {
MockHttpSession session = (MockHttpSession)mvcResult.getRequest().getSession();
session.setMaxInactiveInterval(1);
Thread.sleep(3);
mockMvc.perform(get("/hello")
.session(session))
.andExpect(status().isFound());
});
}
...但没有工作。有人能帮助我理解我做错了吗?
答案 0 :(得分:1)
session.setMaxInactiveInterval(1); // in seconds
Thread.sleep(3); // in milliseconds