【发布时间】:2016-08-06 21:13:41
【问题描述】:
我正在制作一个使用 Spring 4 框架的 Java webapp。
当用户发出任何请求时,如果用户未登录,我使用拦截器将此请求对象存储在用户的会话中。然后我将用户重定向到登录屏幕。
当用户成功登录时,我希望登录控制器不返回模型和视图(例如主页),而是从会话中获取存储的先前请求并“执行”它,就像用户刚刚启动一样那个请求。
我在填写一些变量时遇到了一些问题:
public ModelAndView login(RedirectAttributes redirectAttributes)
{
... //Do login stuff.
HttpServletRequest previousRequest = (HttpServletRequest) httpServletRequest.getSession().getAttribute("previousRequest");
httpServletRequest.getRequestDispatcher(previousRequest.getServletPath()).forward(previousRequest, ????????);
//end of method, I must return a ModelAndView but I don't have any view, I just want the request to be forwarded??
return null; //???????????
}
- 获取请求调度器时,需要给它一个url。我使用了 httpServletRequest.getServletPath() 但我不确定这是否正确。
- 转发时,需要给一个请求和响应对象。但我此时没有响应对象。我也许也可以像处理请求一样存储响应对象。或者还有其他方法吗?如果我提供 CURRENT 响应对象而不是 PREVIOUS 响应对象,会发生什么情况?
- 我的方法希望我返回一个模型和视图,但我没有。如何告诉 Spring 停止执行其正常的“modelandview”方案,而是开始处理请求的转发?
【问题讨论】:
-
Spring 肯定已经为你做了这一切吗?
-
Spring security 可能会这样做,但这不是重点。我不使用弹簧安全性,我正在自己制作登录逻辑。我这样做是因为我想了解它是如何工作的(通过自己做),而不仅仅是使用库。
-
尝试按照此处stackoverflow.com/questions/9034149/… 所述进行重定向。你可以返回任何你喜欢的东西,我想如果你处理刷新响应缓冲区(response.flushBuffer();)会被忽略
-
@VladimiroCorsi 我显然无法进行重定向,因为这样一个新请求会进入我的应用程序,我不希望这样 - 我希望执行前一个请求。
标签: java spring http login forward