如何提取用户名以在 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>

我现在要做的是使用已订阅的用户名,我想使用此用户名自动填充输入文本框,但不知道如何做到这一点,有什么想法吗?

使用容器托管身份验证时(似乎是这种情况),用户名存储在容器安全上下文中。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豆:

<h:inputText id="username" value="#{user.name}" />

免责声明:这只是一个例子,有点旧,因为它使用过滤器和其他方法也可能有效,但即使在非 JSF 环境中,这个方法也有效。随意使用它,但要明白这不是获得所需内容的唯一方法。

首先,您必须定义一个受管 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>

相关内容

  • 没有找到相关文章