我有一个登录表单和一个进行登录的servlet。如果用户有效,我会将他重定向到下一页
response.sendRedirect("welcome.jsp");
此外,我想将一个对象发送到此页面,所以我将sendRedirect替换为此
request.setAttribute("notes", notesObject)
disp = getServletContext().getRequestDispatcher("/welcome.jsp");
disp.forward(request, response);
现在的问题是,现在,当用户登录(例如用户/ 111)时,在地址栏中我有:
localhost:8084/WebApplication2/loginServlet?username=user&password=111&action=LOGIN
但是当我使用Sendredirect时我只有localhost:8084/WebApplication2/welcome.jsp
登录Servlet:
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//code...
jsp文件:
<form action="loginServlet">
//code...
答案 0 :(得分:1)
问题不在于forward()
或sendRedirect()
,而在于您从HTML
表单发送数据的方式。
请注意,<form>
标记使用GET
方法作为默认HTTP方法。由于您没有明确地给出任何方法,因此它将使用GET
方法。
请参阅this link:
<!ATTLIST FORM
%attrs; -- %coreattrs, %i18n, %events --
action %URI; #REQUIRED -- server-side form handler --
method (GET|POST) GET -- HTTP method used to submit the form--
enctype %ContentType; "application/x-www-form-urlencoded"
accept %ContentTypes; #IMPLIED -- list of MIME types for file upload --
name CDATA #IMPLIED -- name of form for scripting --
onsubmit %Script; #IMPLIED -- the form was submitted --
onreset %Script; #IMPLIED -- the form was reset --
accept-charset %Charsets; #IMPLIED -- list of supported charsets --
>
现在,通过GET
请求,您的所有表单数据都将作为查询字符串的一部分,这就是您在那里看到这些数据的原因。您应该将方法更改为POST
。
<form action="loginServlet" method = "POST">
使用sendRedirect()
时没有看到数据的原因是,response.sendRedirect()
客户端创建并发送新请求。因此,您的旧请求 URI 不再存在。对于forward()
,情况并非如此。 URI 不会更改,您会看到带有查询字符串的原始 URI 。
当我使用Sendredirect时,我只有
localhost:8084/WebApplication2/welcome.jsp
正如我所说, URI 会发生变化,您可以看到。因此,您看不到原始 URI 附带的查询字符串。
另见: