我写了一个名为 login.jsp (tomcat6) 的页面,它有一个登录表单(用户名、密码等)。
我已经映射了表单操作和 servlet,因此表单提交导致调用登录 servlet。
<强>1。 login.jsp 有一个调用 servlet 的表单。
<form name="login_form" action="servlet/login" method="POST">
<强>2。部署描述符 (web.xml) 中的 servlet 映射
<servlet>
<servlet-name>ServletLogin</servlet-name>
<servlet-class>com.masatosan.loginservlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletLogin</servlet-name>
<url-pattern>/servlet/login</url-pattern>
</servlet-mapping>
因此,在 jsp 页面中,当用户单击登录按钮时,servlet (LoginServlet.class) 负责登录业务。
当登录因密码不匹配等原因而失败时,servlet 会将用户重定向回登录页面。
LoginServlet.class 中的代码片段
String address = "home.jsp"
if(hasError) {
address = "register.jsp"
}
RequestDispatcher dispatcher = request.getRequestDispatcher(address);
dispatcher.forward(request, response);
问题:
它非常适合第一个请求。
向登录表单提供无效凭据(错误的用户名或密码)。
hasError 标志设置为 true 并将我重定向回登录页面(URL 从 localhost:8080/login.jsp 更改为 localhost:8080/servlet/login )
到目前为止我很开心,但在接下来的事情之后我就不开心了。
- 再次向登录表单提供无效凭据。
结果:
现在我收到 HTTP 404 并且 URL 是:localhost:8080/servlet/servlet/login (带有额外的“servlet”)
我正在寻找的解决方案是在由于登录失败而重定向用户时重定向到原始登录页面。是否可以重定向到 login.jsp 或在导致 404 的 URL 中没有额外的“servlet”文本?
注意:我读过的在线教程提到不像我那样在 url 映射中包含“servlet”<url-pattern>/servlet/login</url-pattern>
但是由于需要区分 php 和其他东西,我拥有的 jsp 主机强制我这样做(mount 指令)。 :(
更新:
我在网上找到这个,还没有测试但是会更新...
response.sendRedirect(LOGIN_PAGE);
解决方案
sendRedirect 方法不是我想要的。我需要通过调度程序转发请求/响应,但 sendRedirect 仅将响应作为参数。
原始问题的诀窍是按照建议的形式使用绝对路径。 我的修复方法是:
(login.jsp)
<%
String path = request.getContextPath();
%>
<form name="login_form" action="<%= path %>/servlet/login" method="POST">
最佳答案
您必须在 login.jsp
的表单定义中使用 ServletLogin
的绝对路径:
<form name="login_form" action="/servlet/login" method="POST">
关于jsp - 重定向后如何防止重复的 URL 连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3664871/