如何在Spring mvc中管理Session

时间:2015-11-26 15:23:59

标签: java spring spring-mvc session

我的问题是: 我需要使用Spring mvc实现登录/注销功能。我的方法如下。 我有一个LoginController,它处理get和post方法。

@RequestMapping(value = "/login", method = RequestMethod.GET)
public String login(Model model) {
    if (sessionController.getSessionUserDto() != null) {
        return "redirect:/secure/admin/index";
    }
    UserDto dto = new UserDto();
    model.addAttribute("userDto", dto);

    return "/login";
}

我有一个SessionController,它是一个包含用户凭据的会话范围的bean。 这是我的POST方法。

@RequestMapping(value = "/login", method = RequestMethod.POST)
public String executeLogin(@ModelAttribute("userDto") UserDto userDto, BindingResult result,
        HttpServletRequest request) {
    String[] suppressedFields = result.getSuppressedFields();
    if (suppressedFields.length > 0) {
        throw new RuntimeException("Attempting to bind disallowed fields: "
                + StringUtils.arrayToCommaDelimitedString(suppressedFields));
    }

    if (userDto.getUser() == null || userDto.getUser().isEmpty()) {
        return "/login";
    }

    if (userDto.getPassword() == null || userDto.getPassword().isEmpty()) {
        return "/login";
    }

    try {
        UserDto dto = userManager.login(userDto.getUser(), userDto.getPassword());
        if (dto != null) {
            sessionController.setSessionUserDto(dto);
            request.getSession().setAttribute("terminal", request.getRemoteAddr());
            return "redirect:/secure/admin/index";
        } else {
            return "/login";
        }
    } catch (DaoException ex) {
        System.out.println("DaoException: " + ex.getMessage());
        return "redirect:/login";
    }
}

问题是每个登录系统的用户总是覆盖存储在SessionController中的用户。也就是说,sessionController只为整个应用程序保留一个用户。如果我在机器A中登录然后打开机器B并请求http://localhost:8080/webapp/login,我将被重定向到索引,就像我被记录一样。 所以我该怎么做?

2 个答案:

答案 0 :(得分:2)

我强烈建议您使用Spring Security。您可以使用默认配置并对您的应用程序进行身份验证。

http://www.mkyong.com/tutorials/spring-security-tutorials/ https://docs.spring.io/spring-security/site/docs/3.0.x/reference/springsecurity.html

如果您需要自定义身份验证,则需要使用身份验证提供程序。这里有一个例子

http://www.baeldung.com/spring-security-authentication-provider

答案 1 :(得分:0)

首先" if(sessionController.getSessionUserDto()!= null)"首次登录后可能始终为真,请查看您的代码。 其次,不要在Controller中使用类范围变量,因为它是单例,用户将覆盖彼此的数据。