【问题标题】:How to manage Session in Spring mvc如何在 Spring mvc 中管理 Session
【发布时间】:2016-02-29 18:05:48
【问题描述】:

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

@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,我将被重定向到索引,就像我被登录一样。 所以我该怎么做?

【问题讨论】:

  • 只需使用SpringSecurity。简单成熟,有几十个接口
  • 那太好了。但是我没有足够的时间来了解它。你知道其他解决方法吗?

标签: java spring spring-mvc session


【解决方案1】:

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

【讨论】:

  • 我明白了。那么,如果我想将用户凭据存储在 sessionController 中,同时又不想在控制器中使用类范围变量,我应该将 sessionController 变量放在哪里?
  • 用户信息应存储在请求或上下文范围内的会话变量中。每个客户端(机器)都应该与您的服务器打开新会话。
  • 你能给我一些代码来理解吗?
  • 这个链接可能对stackoverflow.com/questions/18791645/…有帮助
【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-18
    • 2014-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-16
    相关资源
    最近更新 更多