2017-12-23 6 views
0

こんにちは、私はjavaサーブレットを初めて使用しています。私はクッキーを使用して簡単なショッピングカートの問題を実装しようとしていた。私のウェブページでは、カートに追加できる商品名を入力するように求めています。クッキーに2つ以上の値を追加することはできません

Webページ: シンプルなテキスト入力(製品名) とボタン(カートに追加)

ボタンをクリックすると、Webページには、カートの値が表示されます。

奇妙な問題が発生しています。 3つ以下の値で正常に動作します。 3番目の値を追加しようとすると、最後に追加された2つの値しか表示されません。たとえば、商品a、b、cをそれぞれ追加するとします。 bとcのみが表示されます。

カートサーブレットコード:

String name = request.getParameter("productname"); 

Cookie cookie = new Cookie("product", name); 
cookie.setMaxAge(100 * 60);  
response.addCookie(cookie); 


Cookie[] cookies = request.getCookies(); 

List<String> names = new ArrayList<String>(); 
names.add(name); 

if (cookies != null) { 
    for (Cookie c: cookies) { 
     if (c.getName().equals("product")) { 
      names.add(c.getValue()); 
     } 
    } 
} 

PrintWriter writer = response.getWriter(); 
for (String item: names) { 
    writer.println("<h4>" + item + "</h4>"); 
} 

のindex.jsp:

<form method="post" action="Cart"> 
<input type="text" name="productname" value="Product name"> 
<input type="submit" value="AddToCart"> 
</form> 

私はそれで間違っているかを把握するために非常に多くの時間を費やしています。私はこの奇妙な行動を説明するための間違いを見つけることができませんでした。助けてください。

答えて

1

この現象は、クライアント(ブラウザ)とサーバーが同じ名前のCookieをどのように処理するかによって発生します。

"いくつかのCookieは同じ名前であるが、異なるパス 属性を持つ可能性があります。"

https://docs.oracle.com/javaee/7/api/javax/servlet/http/Cookie.html

だからあなたの場合には、それは基本的に常に更新される(名前とパスに基づいて)同じクッキーです。

あなたの場合はどうなりますか:基本的に、ブラウザはHTTP要求ヘッダーにフィールドを追加することによって、サーブレットにCookieを返します。あなたの最初の製品がa命名されたと仮定すると、あなたが名前bで2番目の製品を送っている、あなたのクッキーヘッダには、サーバがリクエストを受信

productname:b 

Cookie:JSESSIONID=BCC7050AE82AEA1A4B9BED1174424A92; product=a 

と、フォームデータのように見えます新しいCookieが作成され、HttpResponse Cookieリストに追加されます。製品という名前の2つのクッキーを含むリストが、あなたの応答に正しく印刷されます。サーブレットはHTTP応答ヘッダーを使用してブラウザにCookieを送信するため、Cookieは同じであるため、更新のみが行われます。

Set-Cookie:product=b; Expires=Sat, 23-Dec-2017 11:23:53 GMT 

は、結果として、次のリクエストはaが消え製品bおよび製品に関する情報が含まれています。

+0

@ f1I2これは、商品がカートに追加されるたびに別の名前を使用する必要があることを意味しますか? – assasinC

+0

実際、私はウェブサイトがショッピングカートをどのように実装しているのだろうと思っていますか? httpセッションを使用すると、ブラウザが閉じられると失われます。だからこそ、私はクッキーを使って長く滞在できるようにしています。しかし、クッキーにはこの容量の問題があります.Oracleのドキュメントでは、各WebサーバーでサポートされるCookieは20個だと言います。これは、その非常に貴重なリソースを使用することを意味します。 – assasinC

+0

@assasinCセッション自体は、ブラウザが開いている限り、デフォルトで存続するクッキーによって識別されます。基本的には、このデフォルトのCookieより長く存続するセッションCookieが必要です。この[記事](https://stackoverflow.com/questions/3693180/session-lost-when-closing-the-browser)では、これを行う方法について説明しています。 – f1l2

0

web.xmlの次の部分は、ブラウザを閉じてもセッションが無効にならないことがわかりました。 Session Lost when closing the browserのリンクを提案していただいたfI12に感謝します。

<session-config> 
    <session-timeout>11520</session-timeout> 
    <cookie-config> 
    <max-age>11520</max-age> 
    </cookie-config> 
</session-config> 

ショッピングカートのクッキーを使用することは、スケーラブルな解決策ではありません。セッションはこのための手段です。

関連する問題