【发布时间】: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