我有一个登录页面,用户输入用户名和密码:
<form method="post" action="j_security_check">
<p>You need to log in to access protected information.</p>
<table>
<tr>
<td>User name:</td>
<td><input type="text" name="j_username" /></td>
</tr>
<tr>
<td>Password:</td>
<td><input type="password" name="j_password" /></td>
</tr>
</table>
<p><input type="submit" value="Login" /></p>
</form>
我现在要做的是使用已经提交的用户名,我想自动填充一个带有此用户名的输入文本框,但不知道如何执行此操作,任何想法?
答案 0 :(得分:1)
当使用容器管理的身份验证时(因为它似乎是你的情况),用户名被存储在容器安全上下文中。 Servlet规范提供了一个API,允许访问保存用户名的用户主体(java.security.Principal
的实例)。
因此,一旦用户登录,您就可以从java代码访问具有HttpServletRequest.getUserPrincipal()
或用户名HttpServletRequest.getRemoteUser()
的用户主体。或者使用FacesContext.getCurrentInstance().getExternalContext().getRemoteUser()
要在JSP / JSF文件上使用它,您可以使用表达式语言以这种方式访问它:#{request.remoteUser}
,如:
<h:inputText id="username" value="#{request.remoteUser}" />
<强>加成强>:
您的用户支持bean:
public class User implements Serializable {
private String name;
// other user attributes here
public String getName() {
return name;
}
}
添加JSF过滤器:
public class SetupUserFilter implements Filter {
public void init(FilterConfig config) { }
public void destroy() { }
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpSession session = request.getSession(false);
if (session != null) {
User user = session.getAttribute("user");
if (user == null && request.getUserPrincipal() != null) {
// This means user has just logged in.
String username = request.getRemoteUser();
User user = ... // load the User instance from the database using the username
session.setAttribute("user", user);
}
}
chain.doFilter(req, res);
}
}
在web.xml
:
<filter>
<filter-name>SetupUserFilter</filter-name>
<filter-class>com.example.SetupUserFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SetupUserFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
然后总是依赖User
bean:
<h:inputText id="username" value="#{user.name}" />
免责声明:这只是一个示例,有点旧,因为它使用过滤器和其他方法也可能有效但这个甚至可以在非JSF环境中工作。随意使用它,但要明白这不是获得所需内容的唯一方法。
答案 1 :(得分:1)
首先,您必须定义托管bean来存储用户的数据:
@Named
@SessionScoped
public class User implements Serializable {
private String name;
private String password;
public String getName() {
return name;
}
public String setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public String setPassword(String password) {
this.password = password;
}
}
当然,您必须为密码实施某种加密,但这只是为了演示如何创建一个简单的bean。
接下来,您的表单将使用EL(表达式语言)将用户输入设置为相应的bean字段:
<h:form>
<h3>Please enter your name and password.</h3>
<table>
<tr>
<td>Name:</td>
<td><h:inputText value="#{user.name}"/></td>
</tr>
<tr>
<td>Password:</td>
<td><h:inputSecret value="#{user.password}"/></td>
</tr>
</table>
<p><h:commandButton value="Login" action="hello"/></p>
</h:form>
最后,您可以在hello.xhtml页面上显示输入:
<h:head>
<title>Welcome</title>
</h:head>
<h:body>
<h3>Hello #{user.name}, your password is #{user.password}</h3>
</h:body>