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

コンテナー管理認証を使用する場合 (あなたの場合のように)、ユーザー名はコンテナー セキュリティ コンテキストに格納されます。サーブレット仕様は、ユーザー名を保持するユーザー プリンシパル( のインスタンス)へのアクセスを許可する 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 以外の環境でも機能します。自由に使用してください。ただし、これが探しているものを取得する唯一の方法ではないことを理解してください。

于 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 に答える