我有一个基于表单身份验证的webapp。在登录页面上,我已经放置了一个公共注册表单的链接。注册会在数据库中添加用于身份验证的用户。
现在,可以在注册完成后以新用户身份自动登录,而无需返回登录页面?
更新
根据要求提供更多信息:
$ CATALINA_BASE / conf / server.xml中的DataSource:
...
<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 / context.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 :(得分: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 :(得分:1)
喜欢说;给你一个明智的建议,你不要提供很多信息。
我会这样做:
答案 2 :(得分:1)
我有两个想法。创建一个新的HttpSession并尝试将用户放入会话中。 或者使用HTTP变量将用户名和密码传递到登录页面,并使用javascript自动提交表单。
答案 3 :(得分:0)
这个问题似乎与this question类似。
简单的答案是调用request.login(username, password);
来登录用户,然后将他们重定向到正确的页面。