【问题标题】:Forwarding to httpRequest that is not the current HttpRequest转发到不是当前 HttpRequest 的 httpRequest
【发布时间】: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; //???????????
}
  1. 获取请求调度器时,需要给它一个url。我使用了 httpServletRequest.getServletPath() 但我不确定这是否正确。
  2. 转发时,需要给一个请求和响应对象。但我此时没有响应对象。我也许也可以像处理请求一样存储响应对象。或者还有其他方法吗?如果我提供 CURRENT 响应对象而不是 PREVIOUS 响应对象,会发生什么情况?
  3. 我的方法希望我返回一个模型和视图,但我没有。如何告诉 Spring 停止执行其正常的“modelandview”方案,而是开始处理请求的转发?

【问题讨论】:

  • Spring 肯定已经为你做了这一切吗?
  • Spring security 可能会这样做,但这不是重点。我不使用弹簧安全性,我正在自己制作登录逻辑。我这样做是因为我想了解它是如何工作的(通过自己做),而不仅仅是使用库。
  • 尝试按照此处stackoverflow.com/questions/9034149/… 所述进行重定向。你可以返回任何你喜欢的东西,我想如果你处理刷新响应缓冲区(response.flushBuffer();)会被忽略
  • @VladimiroCorsi 我显然无法进行重定向,因为这样一个新请求会进入我的应用程序,我不希望这样 - 我希望执行前一个请求。

标签: java spring http login forward


【解决方案1】:

上述设置在 Jboss 中是不可能的。您不能转发和传递任意请求对象,因为 servlet 容器会显示错误。 forward 方法用于转发容器开始处理的当前请求对象。

一种可能的策略,虽然仍然不理想,但将存储的请求与新传入的请求包装在一起,并覆盖 getParameters()´ andgetAttribute()´ 等重要方法以使用存储的请求而不是实际的请求。这就是 Spring security 解决这个问题的方式。

似乎不可能告诉 servletcontainer 停止处理当前请求并重定向或转发到您恰好在 servlet 中可用的任意请求对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-29
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多