加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 00:26:33 所属栏目:Java 来源:网络整理
导读:我试图将servlet响应转发到它来自同一页面(a.k.a:上一页,或“servlet”调用者). 我见过很多答案(比如this和this),但仍然无法使其发挥作用. 我通常会执行以下操作将servlet的响应重定向到另一个页面: request.getRequestDispatcher("MyNewPage").forward(re
我试图将servlet响应转发到它来自同一页面(a.k.a:上一页,或“servlet”调用者).

我见过很多答案(比如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);

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

我究竟做错了什么?

解决方法

首先,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">

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读