我在以下网址下有一个Java应用服务器: -
登陆此页面的用户将被要求使用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.
我不确定为什么找不到上述资源。
答案 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容器无法处理用于浏览器的#
部分并给出错误。