如何提取用户名以在JSF的另一部分中使用

时间:2013-01-21 14:54:00

标签: jsf

我有一个登录页面,用户输入用户名和密码:

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

我现在要做的是使用已经提交的用户名,我想自动填充一个带有此用户名的输入文本框,但不知道如何执行此操作,任何想法?

2 个答案:

答案 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>