2010-04-19 228 views
1

我有一個基於表單的身份驗證的web應用程序。在登錄頁面上,我已經放置了一個公共註冊表單的鏈接。註冊將用戶添加到用於驗證的數據庫中。註冊後自動登錄

現在,可以在註冊完成後以新用戶的身份進行自動登錄,而無需返回到登錄頁面?

UPDATE

更多信息,按要求:

數據源在$ CATALINA_BASE/conf目錄/ server.xml中:

... 
    <GlobalNamingResources> 
... 
     <Resource auth="Container" type="javax.sql.DataSource" name="jdbc/gporder" 
        driverClassName="com.mysql.jdbc.Driver" 
        url="jdbc:mysql://localhost/gporder" 
        maxActive="100" maxIdle="30" maxWait="10000" 
        username="xxx" password="yyy"/> 
... 
    </GlobalNamingResources> 
... 

資源鏈接和領域在$ MYWAR/META-INF /上下文.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<Context path="/gporder"> 
    <ResourceLink global="jdbc/gporder" name="jdbc/gporder" 
      type="javax.sql.DataSource"/> 
    <Realm className="org.apache.catalina.realm.DataSourceRealm" 
      dataSourceName="jdbc/gporder" debug="99" localDataSource="true" 
      digest="MD5" roleNameCol="role" userCredCol="password_hash" 
      userNameCol="username" userRoleTable="rolemap" userTable="users"/> 
</Context> 

還有什麼?有一個帶有HTML註冊表單的JSP,以及一個在提交表單時處理POST的servlet。它們都過長,無法粘貼到這裏,但是servlet會構建一個新用戶並將其保存到數據庫中(通過休眠)。

之後,在初始頁面上完成重定向,這會導致tomcat重定向到登錄頁面。所以我的問題是:有沒有辦法使用在註冊表單中輸入的用戶名和密碼強制登錄,並避免在登錄頁面上進一步重定向?

我想避免依賴tomcat的內部類。

+0

是的,這是可能的。但是你沒有給我們足夠的細節給出明智的建議。 – 2010-04-19 11:10:35

回答

2

這是一個可能的解決方案:註冊必須包含在登錄過程中。

註冊表單中包含註冊表單的鏈接,這兩個表單也可以共享同一頁面。下面是login.jsp的代碼:

<%@page contentType="text/html" pageEncoding="UTF-8"%> 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
    "http://www.w3.org/TR/html4/loose.dtd"> 

<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
     <title>Authentication</title> 
    </head> 
    <body> 
     <h1>Authentication</h1> 
     <p>Please enter your username and password below, then click on the 
      'Login' button</p> 
     <form action="j_security_check" method="POST"> 
      <dl> 
       <dt><label for="j_username">Username: </label></dt> 
       <dd><input type="text" id="j_username" name="j_username"></dd> 
       <dt><label for="j_password">Password: </label></dt> 
       <dd><input type="password" id="j_password" name="j_password"></dd> 
       <dd><input type="submit" name="login" value="Login"></dd> 
      </dl> 
     </form> 
     <p>If you don't own an account yet, and would like to register, 
      <a href="register.jsp">please click here</a></p> 
    </body> 
</html> 

這裏是登記表,register.jsp:

<%@page contentType="text/html" pageEncoding="UTF-8"%> 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
    "http://www.w3.org/TR/html4/loose.dtd"> 

<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
     <title>Registration</title> 
    </head> 
    <body> 
     <h1>Registration</h1> 
     <p>Please fill in the form below, then click on the 'Register' 
      button</p> 
     <form action="register" method="post"> 
      <dl> 
       <dt><label for="username">Username: </label></dt> 
       <dd><input type="text" id="username" name="username"></dd> 
       <dt><label for="password">Password: </label></dt> 
       <dd><input type="password" id="password" name="password"></dd> 
       <dt><label for="password">Verification: </label></dt> 
       <dd><input type="password" id="verification" name="verification"></dd> 
       <dt><label for="firstname">First name: </label></dt> 
       <dd><input type="text" id="firstname" name="firstname"></dd> 
       <dt><label for="lastname">Last name: </label></dt> 
       <dd><input type="text" id="lastname" name="lastname"></dd> 
       <dt><label for="email">E-mail address: </label></dt> 
       <dd><input type="text" id="email" name="email"></dd> 
       <dd><input type="submit" name="register" value="Register"></dd> 
      </dl> 
     </form> 
    </body> 
</html> 

提交後,註冊字段被張貼到創建一個新的用戶一個servlet數據庫,然後重定向到/ j_security_check:

String username = request.getParameter("username"); 
String password = request.getParameter("password"); 
User user = new User(); 
user.setUsername(username); 
user.setPassword(password); 
user.setFirstName(request.getParameter("firstname")); 
user.setLastName(request.getParameter("lastname")); 
user.setEmail(request.getParameter("email")); 

// ... register the user, then if everything is OK, do: 

String url = request.getContextPath() + "/j_security_check"; 
response.sendRedirect(url + "?j_username=" 
     + URLEncoder.encode(username, "UTF-8") 
     + "&j_password=" 
     + URLEncoder.encode(password, "UTF-8")); 
1

就像說的那樣;給你一個明智的建議,你不會提供很多信息。

我會做這樣的:

  • 在數據庫中輸入信息(註冊)
  • 執行該occure後,用戶點擊「登錄」
  • 重定向到同一頁面,你同樣的動作會在用戶登錄後
+0

是的。問題在於'用戶點擊'登錄'後發生的操作是由tomcat控制的,而不是由應用程序控制的。我想避免使用tomcat的內部類。 – 2010-04-19 13:10:08

+0

登錄後,如果用戶登錄,會在頁面上創建什麼內容?用註冊表單中的信息創建。重定向應該通過。 – 2010-04-19 13:52:51

1

我有兩個想法。要麼創建一個新的HttpSession,並嘗試將用戶放入會話中。 或者將用戶名和密碼通過HTTP變量傳遞給登錄頁面,並使用javascript自動提交表單。

+1

我也是(最後),但註冊必須包含在登錄方案中。 – 2010-08-29 08:32:02