sendredirect vs requestdispatcher

时间:2015-05-04 17:56:23

标签: java servlets

我在以下网址下有一个Java应用服务器: -

http://t4-dev.pta.com/gui

登陆此页面的用户将被要求使用CAS Server登录,并且该URL将返回http://t4-dev.pta.com/gui/ReturnLoginViaMax

我已经实现了一个Servlet来处理这个URL -

public class CasRedirectServlet extends HttpServlet{
    public void service(HttpServletRequest req, HttpServletResponse res)
            throws IOException, ServletException{

        //RequestDispatcher rd = req
        //      .getRequestDispatcher("/test.jsp");
        RequestDispatcher rd = req.getRequestDispatcher("banana/index.html#/dashboard/file/t4.json");
        rd.forward(req, res);
        //res.sendRedirect("banana/index.html#/dashboard/file/t4.json");
    }
}

所以,现在如果用户点击上面的servlet,他将被重定向到另一个json文件: -

banana/index.html#/dashboard/file/t4.json

如果我执行sendredirect但是当我使用requestdispatcher时它失败

,这是有效的
message /gui/banana/index.html#/dashboard/file/t4.json

description The requested resource is not available.

我不确定为什么找不到上述资源。

2 个答案:

答案 0 :(得分:0)

它不起作用,因为您的路径包含一个URL令牌(#符号后面的部分),这是仅由浏览器解释的客户端事物,而RequestDispatcher.forward()确实如此服务器端内部转发,不会将令牌发送到浏览器。

如果您想以这种方式使用网址令牌,您唯一的选择就是使用sendRedirect()。这会触发浏览器的往返并更新浏览器正在访问的实际URL,从而使浏览器可以访问URL令牌。

答案 1 :(得分:0)

这只是因为前向和重定向完全不同。

重定向时,将URL传递回客户端浏览器。浏览器解释给定的URL banana/index.html#/dashboard/file/t4.json并发出对URL /gui/banana/index.html的请求,获取页面,并自动将其滚动到锚点/dashbord/file/t4.json(或者只有在找不到锚点时才显示它)。

但是在转发时,您要求servlet容器将当前请求传递给能够提供给定URL的servlet,并且servlet容器无法处理用于浏览器的#部分并给出错误。