java – Servlet转发响应调用者/上一页
我试图将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"> 我认为这可以满足您的要求. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |