1

次の関数を使用して、Java サーブレットに設定された Cookie を作成しています。.JSP ファイルのスクリプトレットで削除しようとしています。しかし、それはクッキーを削除していません.理由について何か考えはありますか?

これは、サーブレットで Cookie を作成するために使用している関数です。

    for(String classId :request.getParameterValues("classId")){
        optionCookie = new Cookie("componentSearchOptionSelect",classId);
        response.addCookie(optionCookie);
    }

これは、スクリプトレットで Cookie を削除するために使用しているコードです。

Cookie[] cookies = null;
        cookies = request.getCookies();
        if(cookies != null){
            for(int i = 0; i < cookies.length; i++){
                 Cookie cookie = cookies[i];
                 if(cookie.getName().equals("componentSearchOptionSelect")){

                     selectedClass = cookie.getValue();
                     cookie.setMaxAge(0);
                     response.addCookie(cookie);
                 }
             }
        }
4

2 に答える 2

1

ビュー テクノロジーとしての JSP は、HTTP レスポンス ボディの生成を担当します。Cookie は HTTP 応答ヘッダーに入れる必要があります。そのため、その Cookie コードを JSP の途中に配置し、その時点で JSP がすでに大量の HTML を生成しているため、応答が既にコミットされている場合、HTTP 応答ヘッダーを設定するには単に遅すぎます。HTTP 応答ヘッダーは既にクライアントに送信されており、これは後戻りできません。サーバー ログに注意を払っていれば、IllegalStateExceptionわかりやすいメッセージとトレースが表示されていることに気付くはずです。

したがって、問題を解決するには、応答がまだコミットされていないときに Cookie を削除してください。すべてのビジネス ロジックを含むスクリプトレットを、JSP ページの最上部、JSP が HTTP 応答本文に何かを書き込むずっと前に配置します。

<%
    // Business logic here.
%>
<!DOCTYPE html>
<html>
    ... (presentation logic here)
</html>

実際、JSP はビジネス ロジックを実行する場所として不適切です (スクリプトレットをまったく使用しないでください)。これには、サーブレットまたはサーブレット フィルターを使用する必要があります。あなたの特定のケースでは、サーブレットが必要なだけだと思いますdoGet()

于 2013-02-04T00:28:27.113 に答える
0

これを試してみてください。

/*
Cookie[] cookies = null;
cookies = request.getCookies();
if(cookies != null){
    for(int i = 0; i < cookies.length; i++){
         Cookie cookie = cookies[i];
         if(cookie.getName().equals("componentSearchOptionSelect")){
             selectedClass = cookie.getValue();
             cookie.setMaxAge(0);
             response.addCookie(cookie);
         }
     }
}
*/

Cookie cookie = new Cookie("componentSearchOptionSelect", "");
cookie.setMaxAge(0);
response.addCookie(cookie);

ちなみに、なぜCookie何度も同じ値を設定するのですか?CookiecomponentSearchOptionSelectの値は、からの最後の値ですrequest.getParameterValues("classId"))

于 2013-02-04T00:05:04.127 に答える