Spring 页面调用自身时会话属性丢失
Spring session attribute lost on page calling itself
所以,我有一个非常简单的 2 控制器 Spring MVC 应用程序。第一个控制器登录用户并像这样将其置于会话中
model.addAttribute( "user", userDto );
第二个控制器显示基于 projectId
的项目,但希望用户在会话中。
@Controller
@SessionAttributes( "user" )
@RequestMapping( value = "/project" )
public class ProjectController {
...
@GetMapping( "/{projectId}" )
public String get( @PathVariable( "projectId" ) String projectId, @SessionAttribute( "user" ) UserDto userDto, Model model ) {
...
第一次调用这个控制器工作正常。但是,如果用户在 UI 上更改项目(通过 select onchange="'location = /project/<some-id-from-select>"
),我会收到来自 Spring:
的错误消息
[org.springframework.web.bind.ServletRequestBindingException: Missing session attribute 'user' of type UserDto]
怎么可能一次请求后session属性就丢失了?项目中未定义过滤器、安全性或 session/request 特定配置。
好吧,实际上它更容易修复:我忘记在第一个控制器中添加 @SessionAttributes( "user" )
,其中 model.addAttribute( "user", userDto );
被调用。添加后,一切如常。
所以,我有一个非常简单的 2 控制器 Spring MVC 应用程序。第一个控制器登录用户并像这样将其置于会话中
model.addAttribute( "user", userDto );
第二个控制器显示基于 projectId
的项目,但希望用户在会话中。
@Controller
@SessionAttributes( "user" )
@RequestMapping( value = "/project" )
public class ProjectController {
...
@GetMapping( "/{projectId}" )
public String get( @PathVariable( "projectId" ) String projectId, @SessionAttribute( "user" ) UserDto userDto, Model model ) {
...
第一次调用这个控制器工作正常。但是,如果用户在 UI 上更改项目(通过 select onchange="'location = /project/<some-id-from-select>"
),我会收到来自 Spring:
[org.springframework.web.bind.ServletRequestBindingException: Missing session attribute 'user' of type UserDto]
怎么可能一次请求后session属性就丢失了?项目中未定义过滤器、安全性或 session/request 特定配置。
好吧,实际上它更容易修复:我忘记在第一个控制器中添加 @SessionAttributes( "user" )
,其中 model.addAttribute( "user", userDto );
被调用。添加后,一切如常。