6

私は次のコードを書きました:

public void delete(MyType instance) {
        List<MyType> myList = this.getAll();

        Cookie[] cookies = request.getCookies();
        List<Cookie> cookieList = new ArrayList<Cookie>();
        cookieList = Arrays.asList(cookies);
        for(Cookie cookie:cookieList) {
            if(Long.valueOf(cookie.getValue()) == instance.getId()) {
                cookieList.remove(cookie);
            }
        }
        myList.remove(instance);
        cookies = (Cookie[]) cookieList.toArray();
}

問題は次のとおりです。CookieリストからCookieを削除した場合、更新されたCookieリスト(Cookieを削除せずに)をクライアントに戻すにはどうすればよいですか?*.setCookies();リクエストまたはレスポンスにはメソッドがありません。またはCookieは自動的に更新されますか?よろしくお願いします。

4

1 に答える 1

17

nullの応答に、値と最大経過0時間(およびカスタムパスを設定した場合は同じパス)を使用してまったく同じCookieを設定する必要がありますHttpServletResponse#addCookie()

cookie.setValue(null);
cookie.setMaxAge(0);
cookie.setPath(theSamePathAsYouUsedBeforeIfAny);
response.addCookie(cookie);

具体的な問題とは関係なく、配列をリストにマッサージして戻す必要はまったくありません。拡張されたforループは、アレイでも同様に機能します。また、値の==比較に使用するとLong、-128〜127の値でのみ機能しますequals()。代わりに必要です。したがって、全体として、メソッドは次のようになります。

public void delete(MyType instance) {
    Cookie[] cookies = request.getCookies();

    if (cookies != null) {
        for (Cookie cookie : cookies) {
            if (Long.valueOf(cookie.getValue()).equals(instance.getId())) {
                cookie.setValue(null);
                cookie.setMaxAge(0);
                cookie.setPath(theSamePathAsYouUsedBeforeIfAny);
                response.addCookie(cookie);
            }
        }
    }
}

ちなみに、あるクラスのインスタンス変数であるのrequestを見るのは怖いです。response特定のクラスがスレッドセーフであると確信していますか?サーブレットとスレッドセーフを理解するには、次の回答が役立つ場合があります。サーブレットはどのように機能しますか?インスタンス化、セッション、共有変数、マルチスレッド

于 2012-06-19T14:23:22.243 に答える