我见过很多答案(比如this和this),但仍然无法使其发挥作用.
我通常会执行以下操作将servlet的响应重定向到另一个页面:
request.getRequestDispatcher("MyNewPage").forward(request,response);
但是我试图将“MyNewPage”更改为我见过的其他选项:
request.getRequestDispatcher((String)request.getAttribute("javax.servlet.forward.request_uri")).forward(request,response); request.getRequestDispatcher(request.getHeader("referer")).forward(request,response);
和其他选项,不能使它工作.
我究竟做错了什么?
解决方法
/NameOfApp/http:/localhost:8084/NameOfApp/test.jsp
test.jsp
如果我们从一开始就采取措施,第一个请求就从这个URL开始:
http://localhost:8084/RequestDispatcher/test.jsp
前进工作,但第二次你要向你的Servlet发出请求,Servlet将转发给自己.所以你将进入一个Servlet调用自己的循环.为什么会这样?由于您从表单调用Servlet,这意味着在第一次请求后,浏览器地址框中的URL地址将更改为Servlet的URL地址.
http://localhost:8084/RequestDispatcher/NewServlet
Servlet会将请求转发回JSP页面,浏览器只会显示,但浏览器地址框中的URL仍然是包含Servlet而不是JSP页面的URL:
http://localhost:8084/RequestDispatcher/NewServlet
因此,下次您点击提交时,Servlet会尝试将请求转发给自己.如果我是你,我会使用重定向.它似乎更适合您的目的:
response.sendRedirect(request.getHeader("referer"));
这将始终更改浏览器地址框中的URL并防止Servlet循环.这将对请求参数产生影响,但您始终可以在重定向URL上添加它们(如果它不是敏感信息)或将它们存储在会话中,直到您在下一个第一个请求(将由重定向进行请求)中检索它们为止.
像JSF这样的框架可以帮助您避免这些问题.
允许您使用forward的最简单的解决方案是保持JSP(viewid)调用Servlet而不是使用request.getHeader(“referer”)的形式中的隐藏参数.您需要检查循环,因为有人可能故意更改值以强制您的Servlet容器循环并最终导致VM崩溃.但是你可以使用一个请求属性来记录链中的先前请求,如果它是相同的,你会回复一个错误.因此,在servlet中,您将使用隐藏字段值来决定转发到的位置:
request.getRequestDispatcher(request.getParameter("viewid")).forward(request,response);
在你的JSP中:
<input type="hidden" name="viewid" value="test.jsp">
我认为这可以满足您的要求.