- PR -

Java Server Facesでログイン処理

投稿者投稿内容
MAX
会議室デビュー日: 2005/10/16
投稿数: 5
投稿日時: 2005-10-16 18:40
いつも楽しく拝見させていただいております。
早速、質問させていただきます。
どなたかJSFで開発経験があれば教えてください。

現在JSF+TOMCAT等を使用しWEBアプリを作成しています。
ほぼ出来上がったのですがJSFで分からない部分があります。

初期画面にユーザーIDとパスワードを入力するログイン画面を作成し
DBに登録されている情報と一致すれば次画面に遷移し、なければ画面上に
メッセージを表示しています。また、ユーザーIDもしくはパスワードが未入力の状態で
ログインボタンを押すと、入力コンポーネントタグのrequired属性を使用してnullチェックを行っています。

そこで質問なのですが、ログイン画面でユーザーID・パスワードを
入力されているにもかかわらず、一番最初は必ずユーザーID・パスワードが
未入力と判断されてしまいます。再度入力しログインボタンを押すと問題なしに
動作します。IEで動作確認しているのですが、IE起動後の一回目ログインは100パーセント未入力と判断されてしまいます。
なぜ一発目は入力された値が認識してくれないのかと悩んでいます。


どなたか分かる方がおられればアドバイスをお願いいたします。











よしだひろゆき
大ベテラン
会議室デビュー日: 2004/11/22
投稿数: 141
投稿日時: 2005-10-17 09:59
よしだです.
一回目は動作しないで再表示後には動作する,という現象で典型的なのは,他の入力フィールドに何か問題がある時ですが,この場合はログイン画面なのでユーザーIDとパスワードしか入力項目はありませんよね.

「未入力と判断」というのは通常のrequired="true"によるチェックでエラーメッセージが表示される,ということですか?選れーメッセージを見せてください.
それと可能であれば,ログイン画面だけでもjspソースを見せていただけませんか?
MAX
会議室デビュー日: 2005/10/16
投稿数: 5
投稿日時: 2005-10-17 20:41
返信ありがとうございます。
遅くなりすいません。

おっしゃる通り、required="true"によるチャックでエラー判断されます。
下記にJSPのコードを記載いたします。

<table width="350" border="0" cellpadding="0" cellspacing="0" bgcolor="#CCCCCC">
<tr>
<td colspan="3"><h:graphicImage id="img03" url="./image/spacer.gif" width="1" height="15"/></td>
</tr>
<tr>
<td><h:graphicImage id="img04" url="./image/spacer.gif" width="10" height="30" /></td>
<td width="100">■UID<font color="#CC0000">(*)</font></td>
<td width="240"><h:inputText id="名前" value="#{loginbean.uid}" required="true" size="30"/></td>
</tr>
<tr>
<td><h:graphicImage id="img05" url="./image/spacer.gif" width="10" height="30" /></td>
<td width="100">■パスワード<font color="#CC0000">(*)</font></td>
<td width="240"><h:inputSecret id="パスワード" value="#{loginbean.password}" required="true" size="30"/></td>
</tr>
<tr>
<td colspan="3"><h:graphicImage id="img06" url="./image/spacer.gif" width="1" height="15"/></td>
</tr>
<tr align="center">
<td colspan="3"><h:graphicImage id="img07" url="./image/border4.gif" width="334" height="3" /></td>
</tr>
<tr>
<td colspan="3"><h:graphicImage id="img08" url="./image/spacer.gif" width="1" height="15"/></td>
</tr>
<tr align="right">
<td colspan="3"> <h:commandButton id="login" action="#{loginbean.LoginAction}" value="ログイン"/></td>
</tr>
<tr align="right">
<td colspan="3"><h:graphicImage id="img09" url="./image/spacer.gif" width="1" height="15"/></td>
</tr>
<tr align="right" bgcolor="#FFFFFF">
<td colspan="3"><h:graphicImage id="img10" url="./image/spacer.gif" width="1" height="5" /></td>
</tr>
<tr align="right" bgcolor="#FFFFFF">
<td colspan="3">
<h:commandLink id="rePwd" immediate="true" action="doPwd">
<h:outputText value="■パスワード再設定■"/>
</h:commandLink>
</td>
</tr>
</table>

入力フィールドが2つとボタンが1つ、それとページ遷移用のリンクボタンとなっています。参考になれば幸いです。

加納正和
ぬし
会議室デビュー日: 2004/01/28
投稿数: 332
お住まい・勤務地: 首都圏
投稿日時: 2005-10-17 22:32
>なぜ一発目は入力された値が認識してくれないのかと悩んでいます。

おお、そういえば思い出した。「一発目」で。

いちばーん最初にURLを入力してブラウザからアクセスしますよね?
そのURLはなんでしょう?

http://www/index.jsf

なはずです。本当?
wwwはともかく拡張子以下は「jsf」なはずです。「jsp」ではなく。

http://www/index.jsp

とアクセスすると、一番最初は、JSF内のサーブレットとは認識せず
単なるjspとして認識するためJSFが関与するデータ群(ログイン画面だと
ユーザ名とパスワード)にアクセスできないため最初はログインに失敗します。
おそらく。

意外とJSF系の注意事項には書いてないのでありました。

なんかの参考にでも。
MAX
会議室デビュー日: 2005/10/16
投稿数: 5
投稿日時: 2005-10-17 23:39
---------------------------------------------------------------
>いちばーん最初にURLを入力してブラウザからアクセスしますよね?
>そのURLはなんでしょう?

>http://www/index.jsf

>なはずです。本当?
>wwwはともかく拡張子以下は「jsf」なはずです。「jsp」ではなく。

>http://www/index.jsp

>とアクセスすると、一番最初は、JSF内のサーブレットとは認識せず
>単なるjspとして認識するためJSFが関与するデータ群(ログイン画面だと
>ユーザ名とパスワード)にアクセスできないため最初はログインに失敗します。
>おそらく。

>意外とJSF系の注意事項には書いてないのでありました。
------------------------------------------------------------------------


加納正和様ありがとうございます。
最初の画面の出し方はwelcomeページ(Index.jsp)を用意しておき、そのページ内に
<jsp:forward page="sys/view/login.jsp" />を記述しログイン画面に遷移させています。web.xmlの<servlet-mapping>のURLパターンに/sys/*と設定しているので
拡張子がjspでもFaces Servletがちゃんと処理しくれていると思っていたのですが。。

一度拡張子を全部jsfの変更して動作確認してみます。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2005-10-18 21:02
JSFはよく知らないのですが、Webアプリケーションでこういう動作をするときは、ログイン
処理直後に遷移するコンポーネントではクッキーを参照できずに未ログインと判断している
場合があります。そのような場合は、リダイレクトで遷移するように変更するとうまく動作
するようになるのですが、この場合はあてはまるでしょうか。
よしだひろゆき
大ベテラン
会議室デビュー日: 2004/11/22
投稿数: 141
投稿日時: 2005-10-19 18:00
引用:

web.xmlの<servlet-mapping>のURLパターンに/sys/*と設定しているので
拡張子がjspでもFaces Servletがちゃんと処理しくれていると思っていたのですが。。
一度拡張子を全部jsfの変更して動作確認してみます。


その問題は無いですね.servlet-mappingがうまく動かずにFacesServletが動作しなかった場合には,Cannot find FacesContext というエラーになります.

MAXさんのソースをそのまま(f:viewとh:formで囲んで)動かしてみましたが(Sun RI 1.101)問題が再現しません.ちゃんと動いてしまいます.
MAX
会議室デビュー日: 2005/10/16
投稿数: 5
投稿日時: 2005-10-19 20:55
uk様 よしだひろゆき様 ありがとうございます。

みなさんの意見を参考に昨日からいろいろと設定をいじくり、試してみました。
結論からいいますと、多分ですが解決できたような気がします。(自信はないですが。。)

私のEclipse3.1.1での配置に問題があるように思えます。

解決前の配置

 /-|
  |-WEB-INF
  |     |-classes
  |     |
  |     |-lib
  |     web.xml
  |     faces-config.xml
  |-view
    |
    |-複数jspファイル

だったのを

 /-|
  |-WEB-INF
  |     |-classes
  |     |
  |     |-lib
  |     web.xml
  |     faces-config.xml
  |
  |-複数jspファイル

に変更したところ初回に必ず発生していたnullチェックがなくなりました。

変更前はWEB-INFフォルダと同階層に、管理しやすいようにとviewフォルダを作成し
その中にJSPファイルをいれていました。そしてweb.xmlの設定で
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/sys/*</url-pattern>
</servlet-mapping>

のように設定を行い、URLでlocalhost:8080/info/sys/view/login.jspと入力し
アプリを動かしておりました。(/sys/を通る事によってFacesServletが処理)

多分なんですが、Struts等とはちがいjspのファイルをフォルダ別管理してしまうと
FacesServletがうまく機能してくれないのではないかと、自分のなかで結論にたっしたのですが。。
/sys/*のアスタリスク部分にはフォルダをいれてはだめではないかと。。

どうなんでしょうか????
あまり参考なるサイトがないのでわかりませんが。
みなさんはjspの配置をどうされてるのでしょうかね。

でもいろいろと貴重なご意見ありがとうございます。

(多分解決したとおもうのですが、納得できないですよね(^^;))

スキルアップ/キャリアアップ(JOB@IT)