我写了一个名为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或者URL中没有额外的“servlet”文本导致404?
注意:我读过的在线教程提到在url映射中不包括“servlet”,就像我<url-pattern>/servlet/login</url-pattern>
那样,但我强迫我这样做的jsp主机(mount指令),因为需要区分php和其他事情。 :(
更新
我在网上发现了这个,尚未测试但会更新......
response.sendRedirect(LOGIN_PAGE);
解决方案
sendRedirect方法不是我想要的。我需要通过调度程序转发请求/响应,但sendRedirect只接受响应作为参数。
原始问题的诀窍是如建议的那样在表单中使用绝对路径。 我的修复工作是:
(login.jsp)
<%
String path = request.getContextPath();
%>
<form name="login_form" action="<%= path %>/servlet/login" method="POST">
答案 0 :(得分:1)
您必须在ServletLogin
中的表单定义中使用login.jsp
的绝对路径:
<form name="login_form" action="/servlet/login" method="POST">