0

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

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

我现在要做的是使用已提交的用户名,我想用这个用户名自动填充一个输入文本框,但不知道该怎么做,有什么想法吗?

4

2 回答 2

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>

然后总是依赖Userbean:

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

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

于 2013-01-21T14:56:23.183 回答
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>
于 2013-01-21T15:09:55.650 回答