- PR -

Actionが2回実行される

投稿者投稿内容
AIVS_HATA
会議室デビュー日: 2005/06/13
投稿数: 5
投稿日時: 2005-06-13 18:56
はじめまして。
現在:Tomcat4.1.18+Struts1.1+Oracle10G+Apache2+IE6.0SP2
で開発をおこなっております。

ファイルのダウンロード処理を作成したのですがなぜかダウンロード処理のアクション
のみ2回実行されています。
Exceptionを設定したところ下記のエラーが発生していました。
調査してみたところ、なぜか
responseのヘッダに“Accept-ranges”を設定すると2回実行され
未設定だと一回のみになります。
“Accept-ranges”はnoneでもbytesでもどちらでも2回実行されてしまいます。

何か解決案はないでしょうか。
御教授お願いします。

java.net.SocketException: Connection reset by peer: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
at org.apache.coyote.http11.InternalOutputBuffer$OutputStreamOutputBuffer.doWrite(InternalOutputBuffer.java:668)
at org.apache.coyote.http11.filters.IdentityOutputFilter.doWrite(IdentityOutputFilter.java:160)
at org.apache.coyote.http11.InternalOutputBuffer.doWrite(InternalOutputBuffer.java:523)
at org.apache.coyote.Response.doWrite(Response.java:524)
at org.apache.coyote.tomcat4.OutputBuffer.realWriteBytes(OutputBuffer.java:384)
at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:360)
at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:338)
at org.apache.coyote.tomcat4.OutputBuffer.writeBytes(OutputBuffer.java:411)
at org.apache.coyote.tomcat4.OutputBuffer.write(OutputBuffer.java:398)
at org.apache.coyote.tomcat4.CoyoteOutputStream.write(CoyoteOutputStream.java:110)
at org.apache.coyote.tomcat4.CoyoteOutputStream.write(CoyoteOutputStream.java:104)
at jp.co.aivs.equos.common.action.DownloadAction.execute(DownloadAction.java:74)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:507)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
at jp.co.aivs.equos.common.filter.NDCFilter.doFilter(NDCFilter.java:98)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:213)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
at jp.co.aivs.equos.common.filter.EncodingFilter.doFilter(EncodingFilter.java:95)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:213)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:260)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2415)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:172)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:223)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:432)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:386)
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:534)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:530)
at java.lang.Thread.run(Thread.java:534)

だーやん
会議室デビュー日: 2004/03/07
投稿数: 16
投稿日時: 2005-06-14 09:20
ファイルローダーを使ったことはないのですが、以前Strutsを使用していて

HTML単体でSubmitするオブジェクト(<Input Type="submit">or<Input Type="Image">)に
Javascriptイベントonclick等を付け、Javascriptでsubmit()を呼び出したにもかかわらず
戻り値としてFalseを返さなかった場合

Actionが2回呼ばれるという事象に遭遇しました。
AIVS_HATA
会議室デビュー日: 2005/06/13
投稿数: 5
投稿日時: 2005-06-14 14:09
ご返答ありがとうございます。

使っているのはbuttunタグでした。
typeをbuttonにしていても現象は発生しています。

下記のソースの抜粋を添付します。
ご参考ください。

test.java-----------------
response.setHeader(
"Content-Disposition",
disposition+";filename=\""+new File(saveFile).getName()+"\"");
response.setContentType("application/pdf");

response.setHeader("Accept-Ranges","bytes");
response.setContentLength((int)new File(saveFile).length());

InputStream in = new FileInputStream(saveFile);
OutputStream out = response.getOutputStream();

byte[] b = new byte[4096];
while ((in.read(b)) != -1) {
out.write(b);
}
in.close();
out.flush();

test.jsp--------------------------------------------
function goPrint() {
document.aaa.submit();
}

<table>
<form name='aaa' action='test' method='post' target='_top'>
<input type="hidden" name="file" value="c:\eudc.pdf">
<input type="hidden" name="disposition" value="inline">
<%--<input type="hidden" name="disposition"
value="attachment">--%>
</form>
<td>
<input type='button' onclick='goPrint();return false;'
name="サブミット" value="GO"></button>
</td>
</table>
永井和彦
ぬし
会議室デビュー日: 2002/07/03
投稿数: 276
お住まい・勤務地: 東京都
投稿日時: 2005-06-14 17:36
Actionが2回実行されてしまう、……ということは、クライアント側が2回Requestを発行してしまっているということですよね?Java(Servlet)がどうこういう話ではなくて、IEとかのクライアントサイドの振る舞いの話に思えますので、HTTPのやり取りの詳細をキャプチャして、Web Client & Report 会議室に移られた方が答えに近いかも知れません。

絞り込むためにちょっと確認したいのですが……

・IE6.0SP2以外(例えばFireFoxとか)を使ってもこの現象は発生しますか? → もしそうならば、HTTP(Accept-ranges)の仕様とかを調べることになるでしょう。IE特有なら、IEのバグレポートとかを調べることになるでしょう。

・PDF以外のファイルを扱ったときもこの現象は発生しますか? → もしそうならば、上記の条件だけで頑張るしかないように思います。PDF特有なら、絞込みWORDが一つ増えて調査(検索)が楽になります。ラッキーです。
AIVS_HATA
会議室デビュー日: 2005/06/13
投稿数: 5
投稿日時: 2005-06-14 18:40
早速の回答ありがとうございます。

下記に回答します。

>・IE6.0SP2以外(例えばFireFoxとか)を使ってもこの現象は発生しますか? → もしそうならば、HTTP(Accept-ranges)の仕様とかを調べることになるでしょう。IE特有なら、IEのバグレポートとかを調べることになるでしょう。

NN7系で確認しましたが現象は起きません。

>・PDF以外のファイルを扱ったときもこの現象は発生しますか? → もしそうならば、上記の条件だけで頑張るしかないように思います。PDF特有なら、絞込みWORDが一つ増えて調査(検索)が楽になります。ラッキーです。

jpg、EXCELで確認しましたが現象は起きません。

よってPDFかつIEでも問題になってきますね。

絞り込んで調査を引き続き行います。
何か情報があればよろしくお願いいたします。
永井和彦
ぬし
会議室デビュー日: 2002/07/03
投稿数: 276
お住まい・勤務地: 東京都
投稿日時: 2005-06-16 12:45
PDFとIE6が組み合わさったときの問題で、Accept-rangesに関して言及されている
……という条件で検索をかけてみると

http://www.tenon.com/lists/html/iTools/2004-05/msg00005.html

のようなものが引っ掛かりました。
何か、変なところに迷い込んでしまったようにも思うのですが、話題になっている
現象が発生する状況は、今回のものと大体同じ感じに見えます。
#英語苦手(がっくし)なので、ざっと眺めただけですが。

コード:
response.setContentType("application/pdf"); 





コード:
response.setContentType("application/x-pdf"); 



に変更する等で解決してしまったりするという幸せな話はあったりしますか?
AIVS_HATA
会議室デビュー日: 2005/06/13
投稿数: 5
投稿日時: 2005-06-17 17:02
お世話になります。AIVS_HATAです。

>response.setContentType("application/pdf");
>↓
>response.setContentType("application/x-pdf");

に変更してみたところ一回しか呼ばれなくなりました。
ありがとうございます。

しかし、本当はIE+ACROBATを使用している特定の環境で
PDFをブラウザ表示しようとするとエラーで落ちてしまうという
現象が有りました。
これの回避策として“ACCEPT-RANGES”を追加した所、特定の環境で
おきていたエラーを回避できていました。

今回“ACCEPT-RANGES”+“ACTIONは一回のみ”になったのですが
またその特定の環境でエラーが発生するようになりました。。

特定のマシンの環境は
Windows XP SP1 + IE6 + ACROBAT6.0.1
です。

しかし、同様の環境を作成して確認しても発生しません。
どの様な要因でそうなっているのかは特定できておりません。

WindowsUpdateのあてかた等まで問題になってくるのでしょうか。

何かこの情報について情報はございませんでしょうか。
永井和彦
ぬし
会議室デビュー日: 2002/07/03
投稿数: 276
お住まい・勤務地: 東京都
投稿日時: 2005-06-21 13:52
引用:

に変更してみたところ一回しか呼ばれなくなりました。
ありがとうございます。

しかし、本当はIE+ACROBATを使用している特定の環境で
PDFをブラウザ表示しようとするとエラーで落ちてしまうという
現象が有りました。
これの回避策として“ACCEPT-RANGES”を追加した所、特定の環境で
おきていたエラーを回避できていました。

今回“ACCEPT-RANGES”+“ACTIONは一回のみ”になったのですが
またその特定の環境でエラーが発生するようになりました。。



「状況としては巻き戻ってしまった」ということで、お役に立てなかったようで残念です。
追加の情報ですが……「Accept-rangesをMETAで与えて、レスポンスヘッダからは避けておいたら云々」みたいな話を以前検索したときに見掛けたような気がするのですが、今改めて探してみても、なんか見付からないです。

「特定の環境でPDFを表示しようとすると上手く表示されない」ということであれば、「多分、環境が壊れているのだから、環境の方を直す」といアプローチの方がいいのではないかなーと思ったりもします。

ところで、「エラーが発生する」場合はエラーメッセージをコピペするようにした方が良いと思いますよ。

また何か分かったら書き込みます。

[ メッセージ編集済み 編集者: 永井和彦 編集日時 2005-06-21 13:59 ]

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