web-dev-qa-db-ja.com

Javaサーブレットで、既存のCookieの値を変更するにはどうすればよいですか?

Javaサーブレットで、既存のCookieの値を変更するにはどうすればよいですか?addCookieメソッドはありますが、HttpServletResponseにはdeleteCookieまたはeditCookieはありません。

30
Zubair

それらは確かに存在しません。それを行うユーティリティメソッドを自分で作成するだけです。特に、目的のCookieを取得することは非常に肥大化しています。例えば。

public final class Servlets {

    private Servlets() {}

    public static Cookie getCookie(HttpServletRequest request, String name) {
        if (request.getCookies() != null) {
            for (Cookie cookie : request.getCookies()) {
                if (cookie.getName().equals(name)) {
                    return cookie;
                }
            }
        }

        return null;
    }

}

Cookieを編集するには、その値を設定してから応答に追加します。

Cookie cookie = Servlets.getCookie(request, "foo");

if (cookie != null) {
    cookie.setValue(newValue);
    response.addCookie(cookie);
}

デフォルトと異なる場合は、必要に応じてmaxage、path、およびdomainも設定します。つまり、クライアントはこの情報を送り返しません。

Cookieを削除するには、最大年齢を0に設定します(できればnullに設定することもできます)。

Cookie cookie = Servlets.getCookie(request, "foo");

if (cookie != null) {
    cookie.setMaxAge(0);
    cookie.setValue(null);
    response.addCookie(cookie);
}

デフォルトと異なる場合は、必要に応じてパスとドメインも設定します。つまり、クライアントはこの情報を送り返しません。

44
BalusC

Kodejavaの例を次に示します。

 public class ReadCookieExample extends HttpServlet {
 protected void doPost(HttpServletRequest request, HttpServletResponse   response)         throws    ServletException, IOException {
    response.setContentType("text/html");
    PrintWriter writer = response.getWriter();

    Cookie[] cookies = request.getCookies();
    for (int i = 0; i < cookies.length; i++) {
        writer.println("Name: " + cookies[i].getName() + "; Value: "                    +                   cookies[i].getValue());            
    }
}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws    ServletException, IOException {
    doPost(request, response);
}

}

Cookieリストを取得し、必要なものを取得し、値を出力する代わりに、次のようなことを行います。

 cookie.setValue(String.valueOf(<new Value>));  
 cookie.setMaxAge(60*60*24*365);   
 cookie.setPath("/");   
 response.addCookie(cookie);  etc...

HTH、

ジェームス

5
James Drinkard