何らかの処理を行ってから Cookie を設定するカスタム タグがあります。しかし、Cookie が設定されておらず、その理由がわかりませんでした。別の開発者は、タグが評価される時点でテンプレート システムを使用しているため、応答ヘッダーはインクルードの一部として既にフラッシュされていると指摘しました。ヘッダーが送信されているため、Cookie を追加することはできないようです (ただし、追加しようとしても状態例外はスローされません)。これを回避する方法はありますか?これは問題のように聞こえますか?
4 に答える
他の人々が言ったように、あなたは本当に最初にこれをしなければならないことを避けたいです。データベースやCookieなどの重い作業を実行するサーブレットがいくつかあり、実際に応答をレンダリングするJSPに制御を渡す、優れたMVCのようなモデルが必要な場合があります。サーブレットが完了するまでJSPはHTMLを生成するために呼び出されないため、このような悲しみにぶつかることはありません。
setCookieが失敗したときに通知しないのは一種の欠点ですが、おそらくページ全体を壊したくないということも理にかなっています。ServletResponse.isCommitted()は、ヘッダーがすでに書き込まれているかどうか、その結果、setCookie()呼び出しが失敗するかどうかを通知します。
あなたが悲惨な状況にあり、絶対にこれを行う必要がある場合(より良い解決策を探している間)、Cookieが設定されるまで応答をメモリにバッファリングするサーブレットフィルタを作成できます。パターンは次のようになります。
doFilter(request, response, chain)
{
BufferedResponse bufferedResponse = new BufferedResponse(response);
try
{
// pass control to the next filter or to the JSP/servlet servicing the request
chain.doFilter(request, bufferedResponse);
}
finally
{
bufferedResponse.flush();
}
}
BufferedResponseは、HttpServletResponseを実装し、明示的にフラッシュするまで基本的にすべてをメモリに保持する必要があります。その時点で、ヘッダー、Cookie、およびバッファリングされた応答本文が書き出されます。
これは完全に機能しますが、リクエストごとに応答本文全体をメモリにバッファリングする必要があるため、Webサーバーは大量の追加メモリを使用することになります。また、ページが完全に完了するまでサーバーはクライアントブラウザへの送信を開始できないため、ページの読み込みが遅くなります。友達の悪いジュジュ。
HTTP Cookie は HTTP ヘッダーの一部であるため、これが問題になることは間違いありません。そのため、HTTP ヘッダーをフラッシュした後に Cookie を書き込むことはできません。
フラッシュしていて、応答バッファリングを使用していない特定の理由はありますか? または、ヘッダーを変更して、フラッシュされる前に Cookie を追加してください。
HTTP は、ボディの後に追加されたフッターがヘッダーのように処理されることも認識しています (同じ形式)。残念ながら、HttpServletResponse には addFooter メソッドがありません (たとえば、Resin API にはあります)。APIがなければ難しいでしょう。単に本文に追加する機会はありません - フッターではなく本文として解析されます。ごめん。
ブラウザー用の html を作成する場合、ページの最後 ( の前</html>
) に JavaScript の一部を含めて、Cookie を設定することができます。
考えられる回避策は、JavaScript を発行して Cookie を設定することだと思います。もちろん、この方法には明らかな問題があります。同様のトリックは、ロード時に Cookie を設定する 1x1 ピクセルの Web バグを含めることです。
JSP (および類似のもの) は、ページ ビューの作成のみに関与させることをお勧めします。また、セッション状態をほとんど保持しません。