- - PR -
formからpostしたはずの値がnullになる。
投稿者 | 投稿内容 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-11-10 18:45
「cow」と申します。
struts1.1にて構築されたシステムにて、現在formからpostされたはずのデータが、時々、全てnullになってしまう現象が発生しており、手を焼いています。 クライアントのキャッシュにて、その時点のhtmlの状態を確認しますと、欠けた所は無く、 お目当てのtagはちゃんと実在しています。 I.Eですから、tagがある限りは、空であっても「初期化されたString」が渡されるはずであると認識していましたが、今回の事例では全く意図的に再現できず、困っています。 お心当たりのある方居られましたら、良きアドバイスをお願いいたします。 環境は、 J2sdk1.4 Apache2.0.43 Tomcat4.1.12 struts1.1 です。 現在実運用中の、某コールセンターシステムです。 接続クライアントは70ほどです。 イントラの為、全機とも「I.E6.0」です。 アプリサーバーは、昨年モデルのfu社製ブレードサーバーで、ramは1G積んでいます。 クライアント−サーバー間のLANは100mbpsです。 | ||||||||||||||||
|
投稿日時: 2004-11-12 15:47
もしかしてそのフォームはenctype="multipart/form-data"を使って送信するんじゃないですか?
この場合はrequest.getParameter()で値を取れません。 cos.jarのMultipartRequestクラスを使うべきです。 例) MultipartRequest multi = new MultipartRequest(request,フォルダ,サイズnew DefaultFileRenamePolicy()); String res = multi.getParameter("パラメータ") | ||||||||||||||||
|
投稿日時: 2004-11-12 16:10
「cow」です。
影フリー様、返信ありがとう御座います。 > もしかしてそのフォームはenctype="multipart/form-data"を使って送信するんじゃないで> すか? 通常の「<form name="xxForm" action="/xxx.do" method="post">」で送信しています。 現象が発生するのが、常に毎回ではなく、時々発生する感じです。 #これが、サーバーに負荷が掛かった時なのかどうかは、今ひとつつかめていないのですが・・ ただ「良くpostされるFormほどよく現象が起こる」・・・というありきたりな事しか判っておりません。。 何か基本的な事をし忘れているのかとも思ったりしましたが・・。 あとは「サーバー上のレスポンス」の問題とか・・ (例えば、同時に複数のRequestがぶつかっておかしくなったりとか・・?) 今はもう、全く糸口がつかめていない状態です。 #何とかしなくては・・(T T) | ||||||||||||||||
|
投稿日時: 2004-11-12 16:14
セッション消失に伴い ActionForm がリセットされてしまうとかは、あり得ますか?
それか、もし ActionForm.reset() で値の初期化を実装してあるなら、 意図しないタイミングで呼ばれていないかを確認するのも手かもしれません。 何とか ActionForm のライフサイクルをトレースすると早く解決するかもしれませんね。 | ||||||||||||||||
|
投稿日時: 2004-11-12 16:39
「cow」です。
でくのぼう様、ご返信有難う御座います。 >セッション消失に伴い ActionForm がリセットされてしまうとかは、あり得ますか? 以前、sessionが喪失した事がありまして(原因は、サーバーのhost名に「_(アンダーバー)」が使われており、それをURLに使っていた。今は「-」に変更済み。)、同じような理屈で「ActionForm」のインスタンスの中身が消えているかもしれない・・って事でしょうか・? そうですね。これに関してはちょっと調べてみたいです。。 ・・がしかし、、 現場では、実に「実運用中」となっていまして、例えばlog4jのレベルを「DEBUG」にする・・なんて事が「レスポンスに影響する」って事で出来なかったりと、中々思うように『TEST』が出来ない状態なんです。。 しかも、この現象、社内環境で再現できていないものですから、、 ・・と「愚痴」っててもしょうがないですね。 ActionFormのインスタンスの状態を確認する方法としては、log4jのDEBUGを使う方法以外に、何か良いやり方は無いのでしょうか・・? 「でくのぼう」様、何か良い方法でもご存知でしたら、よろしくお願いいたします。 | ||||||||||||||||
|
投稿日時: 2004-11-12 16:53
log4j のロギングを引き下げるかどうかは別として、
まずセッション消失等の理由によって ActionForm が リセットされることで、本当にこの現象が再現するかを 開発環境等で確認することから始めた方が良いでしょう。 数十分放置しておくだけで消失しますから、実験は簡単ですよね。 あとは、Cookie が無効になっている端末があるにもかかわらず セッションIDがURLに埋め込まれていない場合も、同様ですね。 こちらはソースをひたすらチェックする、と。 漠然と再現を待っていてもなかなか出てくれなさそうですので 上のような色々と再現しそうなシチュエーションを実践した方が良さそうです。 | ||||||||||||||||
|
投稿日時: 2004-11-12 17:30
「cow」です。
でくのぼう様、良きアドバイス有難う御座います。 >数十分放置しておくだけで消失しますから、実験は簡単ですよね。 そうですよね; こういう肝心なときに思いつかないんですよねー。 >あとは、Cookie が無効になっている端末があるにもかかわ >らずセッションIDがURLに埋め込まれていない場合も、同様ですね。 >こちらはソースをひたすらチェックする、と。 すみません、こちらは自分の知識不足で、いまいち飲み込めなかったのですが、、 これは「ブラウザはCookieを使用してsession-idをClientに覚えている」って見解でよろしいのでしょうか・・? それと、session-idが「jsessionid=xxxx」とかでURLにくっついてくる・・こないは、何処かで設定などするものなのでしょうか・・? 確かにURLにsession-idがくっついてきているのは見た事があるのですが、、 ちなみに今現場のI.Eは実運用にセッティングしている為、アドレスバーが非表示になっています。 そこでです・・(Servletから見て)自分が呼び出されたURLをlogにでも記録すればよいかと思うのですが、可能なのでしょうか・・? (JavaDoc見ようと思っていますが、よろしかったら教えてください。) よろしくお願いいたします。 | ||||||||||||||||
|
投稿日時: 2004-11-12 18:00
その通りです。
「jsessionid=xxxx」は本来であれば明示的に付加しない限りくっつきません。 が、Struts のタグライブラリなどは勝手に付けてくれます。 普通の JSP で実装する場合は
このように明示的に HttpServletResponse.encodeUrl() を介して 変換しないといけません。 また、このメソッドは Cookie が有効なら別に何も付加しません。 これは自動判別してくれます。
リクエストされたパスは簡単に記録できると思います。 HttpServletRequest.getRequestURI(), getRequestURL() とかがあるので。 ただし、セッションIDが付加された場合に、 それも含んでくれるかどうかは、、、忘れました。 仮に含んでくれなくとも HttpServletRequest.isRequestedSessionIdFromURL() とかを使えば回避できるので、さほど大きな問題ではないと思います。 // BBコードを間違えたので修正。 [ メッセージ編集済み 編集者: でくのぼう 編集日時 2004-11-12 18:08 ] |