この2つは同じことをしているようです。誰もが2つの主な違いを説明することはできますか?あなたはいつ他のものを使うのですか?HttpServletRequest.getRemoteUser()とHttpServletRequest.getUserPrincipal()。getName()
HttpServletRequest.getRemoteUser()
HttpServletRequest.getUserPrincipal().getName()
getUserPrincipal()
この2つは同じことをしているようです。誰もが2つの主な違いを説明することはできますか?あなたはいつ他のものを使うのですか?HttpServletRequest.getRemoteUser()とHttpServletRequest.getUserPrincipal()。getName()
HttpServletRequest.getRemoteUser()
HttpServletRequest.getUserPrincipal().getName()
getUserPrincipal()
Principal
は、アプリケーションで認証される可能性のあるユーザーを表します。
getRemoteUser()
リターン 『ユーザーのログイン』ユーザー名;上記の例では、識別名または単にCN "bob"を使用することができますが、X.509クライアント証明書のケースでは完全にはマッピングされません。
getRemoteUser()
は、もともとだけusernameはを入力された要求のためのデータを提供することを意図したことを示唆し、「ユーザ名が後続の各要求とともに送信されているかどうかを、ブラウザとの認証の種類に依存する」のJavadoc状態。ただし、クッキーベースの認証が使用されている場合、ほとんどのリクエストでnull
が返されます。
実際には、getRemoteUser()
は、しばしばgetUserPrincipal().getName()
を呼び出します。 Tomcat 6とJetty 6/7で検証済みです。
方法は、リクエストを担当する「ユーザ」であるエンティティの抽象あるPrincipal
界面由来いくつかのクラスのオブジェクトを返します。それから、実装クラスに応じて、そのユーザー/アイデンティティに関するあらゆる種類の情報を取得するために使用できる実際のオブジェクトが取得されます。これらのプロパティの1つは、getName()
を呼び出すことによって取得したユーザー/アイデンティティの名前の文字列表現です。
getRemoteUser()
は、実際には文字列表現を取得するためのショートカットです。実装クラスによって実装されている他のメソッドにアクセスすることはできません。オブジェクト自体にアクセスするのではなく、名前の文字列表現だけです。
私が慣れ親しんでいるほとんどの使用例について、その文字列表現はあなたが望むものです。私はをと信じています。これは、getRemoteUser()
が存在する理由です。実際には実装クラスオブジェクトへの参照を取得せずに、簡単にアクセスできる簡単な方法があります。
ビット関連の問題:JSR168 1に古いIBMポートレットAPIのコードを変換する
人々は、いくつかのメソッドのパラメータにはHttpServletRequestにPortletRequestを変更する必要がありましたが、その後WPS6から。1以上の人はPortletRequestにキャストすることはできません(それぞれのインタフェースを実装していないようです)。そして、HttpServletRequestで直接getRemoteUserを呼び出すと、nullに戻ります(アプリのセキュリティを有効にするWAS [WebSphere Application Server]のオプションで、web.xmlにセキュリティ関連のマークアップが必要だと言う人もいます)
ワークアラウンドはPUMAを使用するようですが、もちろんIBM WebSphere固有のものです。 getRemoteUserが常にnullを返す場合(getRemoteUserがそのショートカットとして実装されている場合は、getUserPrincipal()もgetUserPrincipal()もnullを返す)、他のポートレットコンテナではおそらく他のベンダー固有のワークアラウンドがあります。私はより多くの洞察を探しています
import com.ibm.portal.portlet.service.PortletServiceHome;
import com.ibm.portal.um.*;
import com.ibm.portal.um.exceptions.PumaException;
import com.ibm.portal.puma.User;
//...
public String getCurrentUser(){
try {
Context ctx = new InitialContext();
Name myjndiname = new CompositeName(PumaHome.JNDI_NAME);
PumaHome myHome = (PumaHome) ctx.lookup(myjndiname);
if (myHome!=null) {
PumaProfile pumaProfile = myHome.getProfile();
com.ibm.portal.um.User user = (com.ibm.portal.um.User)pumaProfile.getCurrentUser();
List attributes = new ArrayList();
attributes.add("uid");
Map userAttributes = pumaProfile.getAttributes(user,attributes);
return (String) userAttributes.get("uid");
}
}
:それはWPS6.1 +で動作するものを見つけるために少し難しいので、
ところで、私は上記の言及PUMAコードは、ここにあります。どちらのセマンティクスは...どう違うのですか?彼らは皆それぞれあなたに2つの異なる結果を与えますか?彼らはいつも同じですか? – Dimitry
+1これは私には明らかです。私はあなたがいつもコードを見ることができることを意味しますが、私は他のコードから派生していると思います。 –
-1。 ** getRemoteUser()** ** ** ** getUserPrincipal()**がそうでない場合** ** Spring MVCテストフレームワークでこの問題が発生します。 ** getUserPrincipal()。getName()**は正しい使い方です! – gavenkoa