【发布时间】:2011-05-26 15:02:05
【问题描述】:
我们有 CAS 的 Spring 安全性(我认为 CAS 不是问题)。
问题不是会话超时,而是如何处理这个超时。
- 请求表单:GET /someform
- 填写多部分表单
- 重启服务器,或者删除JSESSIONID
提交表单:POST /someform (with multipart data)
用户被重定向到登录屏幕
- 登录后用户重定向到表单:GET /someform
- spring 尝试重新发布保存的表单(我认为它正在使用 DefaultSavedRequest)
- 它尝试调用映射到的控制器函数:POST /someform,但请求不是多部分的
- 我们得到一个异常:
调用处理方法失败 [上市 org.springframework.web.servlet.ModelAndView com.xxx.xxx.XXXController.xxxPost(org.springframework.web.multipart.MultipartHttpServletRequest)]; 嵌套异常是 java.lang.IllegalStateException: 当前请求不是类型 org.springframework.web.multipart.MultipartHttpServletRequest: com.secondmarket.web.UrlLowerCaseFilter$LowerCaseUrlServletRequestWrapper@77fb58b6
这是在 AccessDeniedException 时将请求保存到会话的代码,它位于 HttpSessionRequestCache(由 ExceptionTranslationFilter 调用)中:
public void saveRequest(HttpServletRequest request, HttpServletResponse response) {
if (!justUseSavedRequestOnGet || "GET".equals(request.getMethod())) {
DefaultSavedRequest savedRequest = new DefaultSavedRequest(request, portResolver);
if (createSessionAllowed || request.getSession(false) != null) {
// Store the HTTP request itself. Used by AbstractAuthenticationProcessingFilter
// for redirection after successful authentication (SEC-29)
request.getSession().setAttribute(WebAttributes.SAVED_REQUEST, savedRequest);
logger.debug("DefaultSavedRequest added to Session: " + savedRequest);
}
}
}
如果是多部分请求,我如何编写 HttpSessionRequestCache 或 ExceptionTranslationFilter 以不保存请求?
【问题讨论】:
标签: java spring spring-security session-timeout multipartform-data