Spring MVC控制器之间如何传递数据

4

我正在使用SpringMVC编写Web应用程序。我希望在用户注销之前将一些数据保留在会话中。以前,我通过@SessionAttributes(“someData”)实现了它,但是然后我必须为每个请求映射方法放置@ModelAttribute(“someData”)someDataType someData 作为参数。所以这就是我做的:

我的AccessData类:

@Component
@Scope(value = "session")
public class AccessData {

    private long userID;

    private String userKey;

    public AccessData(long ID, String key) {
        this.userID = ID;
        this.userKey = key;
    }

    public long getUserID() {
        return userID;
    }

    public void setUserID(long userID) {
        this.userID = userID;
    }

    public String getUserKey() {
        return userKey;
    }

    public void setUserKey(String userKey) {
        this.userKey = userKey;
    }
}

首先控制器(这里我从表单中获取并验证用户输入):

@Controller
@Scope(value = "session")
public class LoginController {

    @ModelAttribute("accessData")
    public AccessData getAccessData() {
        return this.accessData;
    }

    private Utils utilsService;

    private LoginService loginService;

    @Autowired
    private AccessData accessData;

    @Autowired
    public LoginController(LoginService loginService, Utils utils) {
        this.loginService = loginService;
        this.utilsService = utils;
    }

    @RequestMapping(value = ControllerPaths.LOGIN, method = RequestMethod.POST)
    public ModelAndView showLoginStatus(
            @ModelAttribute(LOGINDATA) LoginData loginData) {
        try {
            accessData = loginService.validateLoginData(loginData);
        } catch (IncorrectLoginDataException e) {
            logger.trace("Showing fail login screen...");
            return utilsService.getShowView(ViewPaths.LOGIN_FAIL);
        } catch (HTTPException e) {
            return utilsService.getShowViewWithStringAttribute(
                    ViewPaths.INFO_VIEW, MESSAGE, CONNECTION_ERROR);
        }
        return utilsService.getShowView(ViewPaths.LOGIN_SUCCESS);
    }
}

第二个控制器:

@Controller
@Scope(value = "session")
public class SecondController {

    @ModelAttribute("accessData")
    public AccessData getAccessData() {
        return this.accessData;
    }

    private Utils utilsService;

    private LoginService loginService;

    @Autowired
    private AccessData accessData;

    @Autowired
    public SecondController(LoginService loginService, Utils utils) {
        this.loginService = loginService;
        this.utilsService = utils;
    }

    @RequestMapping(value = ControllerPaths.SHOW_ACCESS_DATA, method =   RequestMethod.GET)
    public ModelAndView showAccessData(
        System.out.println(accessData.getUserKey());
        return utilsService.getShowView(ViewPaths.INDEX);
    }
}

问题是当我在第二个控制器中打印userKey值时,值为null。我检查了LoginController中获取的数据是否正确,它是正确的。那么我做错了什么?提前感谢您的帮助。

1个回答

2
问题在于你正在将一个新对象分配给accessData变量。相反,你应该更新它已经引用的对象的字段。
accessData = loginService.validateLoginData(loginData);

// Replace above line with something like this. Implement the copyProperties
// method to copy the attributes you need
AccessData newAccessData = loginService.validateLoginData(loginData);
copyPropteries(accessData,newAccessData);

此外,不需要将控制器设置为会话范围,只需在AccessData类的范围注释中添加proxyMode=TARGET_CLASS即可。

它有效了,非常感谢!现在,如果我正在使用ProxyMode,有没有清除会话数据的方法,例如session.setComplete()(对我无效)?或者我应该实现一个清除accessData字段的方法? - Marek Lewandowski
没有自动的方法。你需要显式地清除字段。 - gkamal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接