22737


現在下記のような実装になっています

[code]

    <% session.invalidate(); %>
    
    <html>
    
        <head>～</head>
    
        <body>
    
            <jsp:include flush="true" page="ｘｘｘ.jsp"/>
    
        </body>
    
    </html>
    
[/code]

この状態だとjsp:includeが動作していないようで、画面にはｘｘｘ.jspが表示されておりません。

しかし、以下のように実装を変えると、正常にjsp:includeが動作し、画面にはｘｘｘ.jspが表示されております。  

[code]

    <html>
    
        <head>～</head>
    
        <body>
    
            <jsp:include flush="true" page="ｘｘｘ.jsp"/>
    
        </body>
    
    </html>
    
    <% session.invalidate(); %>
    
[/code]

上記事象より、includeが正常動作しない理由はsession.invalidateだと考えられるのですが、何故session.invalidate(セッション削除)によってjsp:includeが動作しなくなるのかが分かりません。

分かる方がいましたら、ご教授をお願いします。


CC BY-SA 3.0
2016-03-01T07:37:06.363
22691
2020-03-07T09:01:41.670
2020-03-07T09:01:41.670
4236
7626
question
html jsp session
session.invalidate実行後の、jsp:includeが動作しません


`<jsp:include
flush="true">`をすると、サーブレットコンテナは指定したJSPをインクルードする前にレスポンスを出力しようと試みます。

また、インクルード前に`session.invalidate();`をしているため、インクルード先のJSPを読み込むときに、新たにsessionを生成しようとします。  
しかし一度レスポンスを出力しようとした後にsessionを生成することはコンテナの仕様にも依るところですが、基本的にサーブレットの例外となりできません。

対策としては、以下のどちらか2つで可能です。

  1. `<jsp:include>`のflush属性をつけない。
  2. flush属性をつけるときは、インクルードするJSPのpageディレクティブにて、セッションを利用しない宣言をする。  
`<%@ page language="java" contentType="text/html; charset=UTF-8"
session="false" %>`


CC BY-SA 3.0
2016-03-02T13:05:02.277
22737
2016-03-02T13:05:02.277
5778
22691
answer