2010-09-08 50 views
0

我写了一个名为login.jsp(tomcat6)的页面,它有一个登录表单(用户名,密码等)。如何防止重定向后重复的URL连接?

我已经映射表单动作和servlet,因此表单提交导致调用登录servlet。

1. login.jsp具有调用servlet的形式。在部署描述符

<form name="login_form" action="servlet/login" method="POST"> 

2. servlet映射(web.xml)中

<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); 

问题:

它的伟大工程的第一个请求。

  1. 提供登录表单无效的凭据(不正确的用户名或密码)。

  2. hasError标志被设置为true并重定向我回到登录页面(使用URL从本地主机改变:8080/login.jsp的到本地主机:8080/servlet的/登录

到目前为止我很高兴,但不是在接下来的事情之后。

  1. 提供无效的凭证以再次登录表单。

结果:

现在,我得到HTTP 404网址是:本地主机:8080/servlet的/的servlet /登录 (额外 “的servlet”)

的解决方案我我寻找的是重定向到原来的登录页面,当我重定向用户由于登录失败。是否有可能重定向到login.jsp或没有额外的“servlet”文本的URL导致404?

注意:我阅读的在线教程中提到在URL映射中没有包含“servlet”,就像我做过<url-pattern>/servlet/login</url-pattern>,但由于要求区分php和其他东西,jsp主机强制我这样做(挂载指令)。 :(

UPDATE:

我发现这个在网络上,还没有测试,但将更新...

response.sendRedirect(LOGIN_PAGE); 

解决方案

的方法的sendRedirect是不是我想要的。我需要通过调度器转发请求/响应,但sendRedirect仅将响应作为参数。

原始问题的诀窍是在建议的窗体中使用绝对路径。 我修复它的工作是:

(login.jsp) 
<% 
String path = request.getContextPath(); 
%> 

<form name="login_form" action="<%= path %>/servlet/login" method="POST"> 

回答

1

你必须使用ServletLogin绝对路径表单定义login.jsp

<form name="login_form" action="/servlet/login" method="POST"> 
+0

谢谢你的提示! – 2010-09-08 07:28:09