java – Servlet转发响应调用者/上一页

前端之家收集整理的这篇文章主要介绍了java – Servlet转发响应调用者/上一页前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图将servlet响应转发到它来自同一页面(a.k.a:上一页,或“servlet”调用者).

我见过很多答案(比如thisthis),但仍然无法使其发挥作用.

我通常会执行以下操作将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);

和其他选项,不能使它工作.

我究竟做错了什么?

解决方法

首先,request.getHeader(“referer”)返回一个完整的URL,但你必须剥离http:// server [:port] /,因为你传递给request.getRequestDispatcher()的内容会被添加到应用程序上下文中这个:
/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">

我认为这可以满足您的要求.

猜你在找的Java相关文章