我可以在Spring MVC的Interceptor中使用RedirectAttributes或FlashMap吗? [英] Can I use RedirectAttributes or FlashMap in Interceptor of Spring MVC
问题描述
我有一个拦截器来处理用户会话。如果 user
属性不存在,则拦截器将重定向到登录页面。我想使用重定向网址发送会话超时
消息,但我不想在网址中显示该消息。我为 RedirectAttributes
或 FlashMap
进行了很多搜索,但我找不到任何好的解决方案。
I have an interceptor to handle the user session. If the user
attribute does not exist, then the interceptor will redirect to the signin page. I want to send a session timeout
message with the redirect url, but I don't want the message in the url. I google a lot for the RedirectAttributes
or FlashMap
, but I can't find any good solution.
public class UserSessionInterceptor extends HandlerInterceptorAdapter {
protected final Logger logger = LoggerFactory.getLogger(this.getClass());
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
User user = (User)request.getSession().getAttribute(CommonConstants.USER_SESSION_KEY);
if (user == null) {
String msg = String.format("session timeout");
logger.error(msg);
// response.sendRedirect("/signin?errorMessage=" + msg); //I don't want to do this..
return false;
}
return true;
}
}
signinController片段:
signinController snippet:
@Controller
@SessionAttributes(CommonConstants.KAPTCHA_SESSION_KEY)
public class SigninController extends BaseController {
@RequestMapping(value = "/signin", method = RequestMethod.GET)
public String signinPage() {
return "forward:/index.jsp";
}
@RequestMapping(value = "/signin", method = RequestMethod.POST)
public String signin(UserForm userForm, @ModelAttribute(CommonConstants.KAPTCHA_SESSION_KEY) String captchaExpected, RedirectAttributes redirectAttributes, HttpServletRequest request) {
userForm.setCaptchaExpected(captchaExpected);
try {
loginValidator.validate(userForm);
} catch (ValidateFailedException e) {
logger.error(e.getMessage(), e);
redirectAttributes.addFlashAttribute(ERROR_MESSAGE_KEY, e.getMessage());
return "redirect:/signin";
}
User user = userService.getByUsername(userForm.getUsername());
if (user == null || !user.getPassword().equals(DigestUtils.md5Hex(userForm.getPassword()))) {
redirectAttributes.addFlashAttribute(ERROR_MESSAGE_KEY, "username or password is invalid");
return "redirect:/signin";
}
request.getSession().setAttribute(CommonConstants.USER_SESSION_KEY, user);
return "redirect:/dashboard";
}
}
index.jsp片段:
index.jsp snippet:
<%@page contentType="text/html; charset=utf-8"%>
<%@ include file="/WEB-INF/jsp/include.jsp" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>welcome</title>
<meta http-equiv="pragma" content="no-cache" />
<meta http-equiv="keywords" content="" />
<meta http-equiv="description" content="" />
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon" />
<link rel="stylesheet" href="${ctx}/css/bootstrap.min.css">
<link rel="stylesheet" href="${ctx}/css/main.css">
<script src="${ctx}/js/jquery-1.11.1.min.js"></script>
<script src="${ctx}/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<div class="login-box text-center" >
<div class="login-single-panel-header">
<h5 style="color:red">${errorMessage}</h5>
</div>
</div>
</div>
</body>
</html>
非常感谢!
推荐答案
我刚遇到同样的问题。
我对spring源代码进行了调试,寻找spring mvc与flashmap属性的相同之处,并在会话中提出了相同的flashmap属性。
I just encountered the same problem. I debuged the spring source code,looking for how spring mvc same the flashmap attributes,and came up with that it same flashmap attributes in sessions.
这里是我的上一个解决方案:
here is my last solution:
// create a flashmap
FlashMap flashMap = new FlashMap();
// store the message
flashMap.put("ERROR_MESSAGE", "this is the message");
// create a flashmapMapManger with `request`
FlashMapManager flashMapManager = RequestContextUtils.getFlashMapManager(request);
// save the flash map data in session with falshMapManager
flashMapManager.saveOutputFlashMap(flashMap, request, response);
- 上面的代码引用方法
org。 springframework.web.servlet.view.RedirectView#renderMergedOutputModel
,你可以自己检查一下 - the code above referd the method
org.springframework.web.servlet.view.RedirectView#renderMergedOutputModel
,you may check it youself
希望这会帮助你!
这篇关于我可以在Spring MVC的Interceptor中使用RedirectAttributes或FlashMap吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!