検索
ホームページJava&#&チュートリアルJava のサーブレットの Cookie についての簡単な紹介 (画像とテキスト)

Cookie テクノロジーが誕生して以来、インターネット ユーザーと Web 開発者の間で議論の焦点となってきました。以下の記事では、サーブレットへの Cookie の導入に関する関連情報を中心に紹介しています。必要な方はぜひ参考にしてください。

まず「会話」とは何かを理解しましょう。セッションは Web テクノロジーの用語であり、ユーザーがブラウザーを開き、複数のハイパーリンクをクリックし、サーバー上の複数の Web リソースにアクセスし、ブラウザーを閉じるこのプロセスをセッションと呼びます。

ブラウザを開いてページにアクセスし、次にブラウザを開いて同じページにアクセスした場合、セッションは 2 つあり、ブラウザを開いてページにアクセスした後、このページのハイパーリンクから開かれた場合。新しいブラウザーを使用しても、1 つのセッションとしてのみカウントされます。

ブラウザとサーバー間の会話中に、どのユーザーも必然的に何らかのデータを生成し、プログラムはこのデータをユーザーごとに保存する方法を見つけなければなりません。たとえば、ユーザーがハイパーリンクをクリックして製品サーブレットを通じて製品を購入する場合、プログラムは、ユーザーが支払いハイパーリンクをクリックしたときに支払いサーブレットから製品を表示できるように、製品を保存する方法を見つける必要があります。それを払ってください。

商品をクリックするためのサーブレットと支払いを行うためのサーブレットが 2 つの異なる Request リクエスト オブジェクトを送信するため、Request オブジェクトを使用してデータを保存することは不可能であり、ServletContext オブジェクトを使用すると、理論上、転送を使用すると複数のユーザーに対してスレッド セーフの問題が発生します。 function 実現可能ですが、ユーザー エクスペリエンスが大幅に低下し、アイテムをクリックするたびに支払いを求められることになります。したがって、上記の要件に基づいて、セッション中に生成されたデータを保存するには 2 つのテクノロジーがあります。1 つは Cookie で、もう 1 つはセッション テクノロジーです。これについては後続の章で説明します。

この記事では主にサーブレットの Cookie テクノロジーについて説明します。 Cookie テクノロジはクライアント側のテクノロジであり、プログラムは各ユーザーのデータを Cookie の形式でユーザーのそれぞれのブラウザに書き込みます。ユーザーがブラウザを使用してサーバーにアクセスすると、自分のデータも持ち込まれるため、Web サーバーはユーザー自身のデータを処理します。

次の図は、セッション中の最終アクセス時刻を Cookie に設定する単純なプロセスです:

Cookie オブジェクトの作成は、Java オブジェクトを作成するのと同じくらい簡単です:

コンストラクター サーバー側で、ブラウザーから送信された Cookie データを取得したい場合は、リクエストの request.getCookies メソッドを使用できます。オブジェクトを使用して Cookie 配列を取得し、ブラウザに Cookie を出力したい場合は、応答オブジェクトの response.addCookie(Cookie) メソッドを使用します。 request.getCookies方法获得一个Cookie数组,而我们想向浏览器输出Cookie时可以使用响应对象的response.addCookie(Cookie)方法。

同时Cookie对象还有如下一些方法:

  

  getName方法用来获取某个Cookie对象的名称。

  setValue方法和getValue方法分别用来设置和获取某个Cookie对象的值。

  setMaxAge(int expires)方法是设置Cookie的有效期,如果没有这句代码,Cookie的有效期就是一个会话时间(即关闭浏览器该Cookie就不存在了),当设置了Cookie的有效期后,Cookie会保存在浏览器指定的硬盘文件中,同时在这段时间内,每次访问服务器都会带着Cookie过去。如果将该方法参数置为“0”,则服务器会指示浏览器删除该Cookie。

  setPath方法是设置Cookie的有效路径。表示在访问某些特定URL时才会带Cookie过去。假设某个web应用为【myservlet】,如果我们将setPath方法中的参数设置为“/myservlet”,那么访问该web应用下所有的资源都会使浏览器发送Cookie过去;而如果我们将setPath方法中的参数设置为“/myservlet/pages”,那么只有访问该web应用中的【pages】下的资源才会带Cookie过去,而访问该web应用中的其他资源则不会带Cookie给服务器。如果我们没有设置setPath方法,那么该Cookie的有效路径默认为创建Cookie对象的当前程序所在目录。注意,Cookie的路径是给浏览器使用的(详见《Servlet的学习之web路径问题》)

  setDomain方法是设置Cookie的有效域名,如: .sina.com

同時に、Cookie オブジェクトには次のメソッドもあります: 🎜🎜 🎜🎜 getNameメソッドはCookieオブジェクトの名前を取得するために使用されます。 🎜🎜 setValueメソッドとgetValueメソッドは、それぞれCookieオブジェクトの値の設定と取得に使用されます。 🎜🎜 setMaxAge(intexpires) メソッドは、Cookie の有効期間を設定するためのもので、このコードがないと、Cookie の有効期間は 1 セッション時間になります (つまり、Cookie は次の時点で存在しなくなります)。ブラウザが閉じられている場合) Cookie の有効期間が経過すると、Cookie はブラウザによって指定されたハードディスク ファイルに保存され、この期間中はサーバーにアクセスするたびに保存されます。このメソッドのパラメータが「0」に設定されている場合、サーバーはブラウザに Cookie を削除するように指示します。 🎜🎜 setPathメソッドはCookieを設定するための有効なパスです。特定の URL にアクセスした場合にのみ Cookie が送信されることを示します。 Web アプリケーションが [myservlet] であるとします。 setPath メソッドのパラメータを「/myservlet」に設定すると、Web アプリケーションの下のすべてのリソースにアクセスすると、ブラウザが Cookie を送信します。パラメータが「/myservlet/pages」に設定されている場合、Web アプリケーションの [pages] の下にあるリソースにアクセスする場合にのみ Cookie が送信され、Web アプリケーションの他のリソースにアクセスしても Cookie はサーバーに送信されません。 setPath メソッドを設定しない場合、Cookie の有効なパスはデフォルトで、Cookie オブジェクトを作成した現在のプログラムが配置されているディレクトリになります。 Cookie パスはブラウザによって使用されることに注意してください (詳細については、「サーブレット学習 Web パスの問題」を参照してください) 🎜🎜 setDomain メソッドは、Cookie の実効ドメイン名を設定します (例: .sina.com) code> (先頭にドットがあることに注意してください)。ブラウザがドメイン名にアクセスするときに Cookie が送信されることを示します。しかし現在では、ブラウザは基本的にこの機能は安全ではないと考えられるため完全にブロックしているため、ほぼ放棄されています。 🎜<p>  举例:我们访问某个Servlet,而在访问这个Servlet时会将当前访问时间作为Cookie中的值返回给客户端,同时下次再次访问该Servlet时,会显示上一次客户端来访问的时间:</p> <p class="jb51code"><br></p><pre class='brush:php;toolbar:false;'>public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding(&quot;UTF-8&quot;); response.setContentType(&quot;text/html;charset=utf-8&quot;); PrintWriter writer = response.getWriter(); writer.write(&quot;您上次访问的时间是:&quot;); //获取用户上一次的访问时间并显示 Cookie[] cookies = request.getCookies(); //从请求中获取客户端发来的Cookie for(int i=0;cookies!=null &amp;&amp; i&lt;cookies.length;i++) { if(cookies[i].getName().equals(&quot;lastAccessTime&quot;)) { //获取最后访问时间的Cookie Long mTime = Long.parseLong(cookies[i].getValue()); String lastAccessTime = new Date(mTime).toLocaleString(); writer.write(lastAccessTime); } } //将本次登录时间重新装载进Cookie中并返回给客户端 Cookie timeCookie = new Cookie(&quot;lastAccessTime&quot;, System.currentTimeMillis()+&quot;&quot;); timeCookie.setMaxAge(1*24*60*60); //将Cookie有效期置为一天 response.addCookie(timeCookie); //将Cookie传回客户端 }</pre><p>第一次访问是没有Cookie的,所以看不到访问时间:</p> <p style="text-align: center"><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/194/98adc163f83cb489dcaf44ec21626730-3.png?x-oss-process=image/resize,p_40" class="lazy" alt="" style="max-width:90%" style="max-width:90%">  </p> <p>但是我们通过HttpWatch观察Response响应包中的内容已经有了“Set-Cookie”响应头:</p> <p style="text-align: center"><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/194/720f344d77dead6a105696519b916df7-4.png?x-oss-process=image/resize,p_40" class="lazy" alt="" style="max-width:90%" style="max-width:90%">  </p> <p>刷新后的第二次访问就可以看到了:</p> <p style="text-align: center"><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/194/720f344d77dead6a105696519b916df7-5.png?x-oss-process=image/resize,p_40" class="lazy" alt="" style="max-width:90%" style="max-width:90%">  </p> <p>同时观察HttpWatch中Request请求包的“Cookie”请求头可以发现:</p> <p style="text-align: center"><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/194/720f344d77dead6a105696519b916df7-6.png?x-oss-process=image/resize,p_40" class="lazy" alt="" style="max-width:90%" style="max-width:90%">  </p> <p>  现在我们再来通过一个案例来学习Cookie,这是一个很常见的案例,比如我们在访问购物网站的时候经常会发现当浏览了这个网站内的某个商品的时候,下次继续来访问这个网站,会有一个上次浏览物品的显示。</p> <p>  如果我们不是用登录后将记录保存在服务器端,而是使用Cookie技术来将记录保存在客户端的浏览器中(现实生活中当然很少这样使用,这里只是作为案例学习),那么我们应该怎么做呢?</p> <p>  首先我们必须在服务器要有两个Servlet,一个在用户眼中是用来显示所有商品的,一个是用来显示点击某个商品之后详细信息的。</p> <p>  ⑴.用来显示所有商品的Servlet需要完成如下功能:</p> <p>   ①     在一个部分以超链接形式将数据库中所有的商品显示在该Servlet上。</p> <p>   ②     在另一个部分获取用户请求中的Cookie将之前浏览过的商品(通过Cookie中的商品id)显示在该Servlet上。</p> <p>  ⑵.   用来显示点击某个商品之后详细信息的Servlet需要完成如下功能:</p> <p>   ①     在页面上通过超链接的URL跟随的参数(即商品id)来获取该商品对象,同时将该商品对象的详细信息输出到Servlet页面上。</p> <p>   ②     如果是用户首次访问,将用户浏览商品的id作为Cookie直接返回,而如果是用户再次访问,则需要根据一定的条件来将这些Cookie的值进行调整,以便易于显示和满足用户体验。</p> <p>   当然,在这之前我们还需要做些准备工作,我们需要建立商品对象,这里简单的以书为商品建立对象:</p> <p class="jb51code"><br></p><pre class='brush:php;toolbar:false;'>public class Product { private String id; private String name; private String author; public Product() { super(); } public Product(String id, String name, String author) { super(); this.id = id; this.name = name; this.author = author; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } }</pre><p>我们还需要一个数据库来保存商品,这里我们先用一个类来来保存(数据库还没学嘛T_T!),保存数据采用Map集合,这是因为如果有检索会方便:</p> <p class="jb51code"><br></p><pre class='brush:php;toolbar:false;'>public class ProductDatabase { private static Map&lt;String,Product&gt; map = new HashMap&lt;String, Product&gt;(); static{ map.put(&quot;1&quot;, new Product(&quot;1&quot;,&quot;《Java编程思想》&quot;,&quot;JB&quot;)); map.put(&quot;2&quot;, new Product(&quot;2&quot;,&quot;《Java核心技术》&quot;,&quot;fdaf&quot;)); map.put(&quot;3&quot;, new Product(&quot;3&quot;,&quot;《Java并发编程》&quot;,&quot;什么鬼&quot;)); map.put(&quot;4&quot;, new Product(&quot;4&quot;,&quot;《Head first 设计模式》&quot;,&quot;老王&quot;)); map.put(&quot;5&quot;, new Product(&quot;5&quot;,&quot;《HTML5权威手册》&quot;,&quot;hhaa&quot;)); } public static Map&lt;String,Product&gt; getMap() { return map; } }</pre><p>做完了这两步,那么我们可以安心的去搞Servlet了,首先是在显示所有商品的Servlet:</p> <p class="jb51code"><br></p><pre class='brush:php;toolbar:false;'>response.setCharacterEncoding(&quot;UTF-8&quot;); response.setContentType(&quot;text/html;charset=utf-8&quot;); PrintWriter writer = response.getWriter(); //从数据库中取出要显示在购物网站首页的商品 Map&lt;String,Product&gt; map = ProductDatabase.getMap(); if(map == null) { writer.print(&quot;您访问的宝贝已下架&quot;); return ; } for(Map.Entry&lt;String, Product&gt; en : map.entrySet()) { writer.print(&quot;&lt;a href=&amp;#39;/CookieProductProject/servlet/DetailGoodServlet?id=&quot;+en.getKey()+&quot;&amp;#39; target=&amp;#39;_blank&amp;#39; &gt;&quot; +en.getValue().getName()+&quot; &lt;br/&gt;&quot;); } //显示用户之前浏览过的商品,要从用户发送的请求中的Cookie里取得 writer.print(&quot;&lt;br/&gt;&lt;br/&gt;&quot;); writer.print(&quot;您最近浏览过的商品: &lt;br/&gt;&quot;); Cookie[] cookies = request.getCookies(); for(int i=0;cookies!=null &amp;&amp; i&lt;cookies.length;i++ ) { if(cookies[i].getName().equals(&quot;productHistory&quot;)) { Cookie cookie = cookies[i]; String productId = cookie.getValue(); String[] splitId = productId.split(&quot;\\_&quot;); for(String sId:splitId) { Product book = ProductDatabase.getMap().get(sId); writer.print(book.getName()+&quot;&lt;br/&gt;&quot;); } } } }</pre><p>最后是点击某个商品显示详细信息的Servlet:</p> <p class="jb51code"><br></p><pre class='brush:php;toolbar:false;'>response.setCharacterEncoding(&quot;UTF-8&quot;); response.setContentType(&quot;text/html;charset=UTF-8&quot;); PrintWriter writer = response.getWriter(); //通过用户点击商品的超链接而跟随URL来的ID参数来获取商品的详细信息 String productId = request.getParameter(&quot;id&quot;); Map&lt;String, Product&gt; map = ProductDatabase.getMap(); Product book = map.get(productId); writer.print(&quot;商品名:&quot;+book.getName()+&quot;&lt;br /&gt;&quot;); writer.print(&quot;作者:&quot;+book.getAuthor()); //同时通过Cookie将用户观看的商品以Cookie的形式回传给用户浏览器 Cookie[] allCookies = request.getCookies(); Cookie cookie = creCookie(book.getId(),allCookies); cookie.setMaxAge(24*60*60); response.addCookie(cookie);</pre><p>其中<code>creCookie(String,Cookie[])是自定义方法,用于获取用户的cookie并添加本次浏览商品id再作为cookie返回:


private Cookie creCookie(String id, Cookie[] cookies) {
  Cookie cookie = null;
  
  if(cookies == null) { //如果cookies为空,说明用户首次访问
   cookie = new Cookie("productHistory", id);
   System.out.println(cookie.getValue());
   return cookie;
  }
  for(int i=0; i<cookies.length; i++) {
   if(cookies[i].getName().equals("productHistory")){
    cookie = cookies[i];
   }
  }
  
  String historyStr = cookie.getValue(); //此时获取到的之前浏览过数据的历史记录,有多种情况
  String[] produIds = historyStr.split("\\_");
  
  //为了检测数组中是否有包含当前的id,建议使用集合,而且是使用链表结构的集合
  LinkedList<String> list = new LinkedList<String>(Arrays.asList(produIds));
  if(list.contains(id)) {
   list.remove(id);
  }
  else if(list.size()>=3){
    list.removeLast();
  }
  
  list.addFirst(id);
  
  StringBuilder sb = new StringBuilder();
  for(String sId :list) {
   sb.append(sId+"_");
  }
  sb.deleteCharAt(sb.length()-1); 
  cookie.setValue(sb.toString());
  System.out.println(cookie.getValue());
  return cookie;
}

我们在浏览器中进行首次访问:

  

随便点击个连接,可以看到该商品的详细信息(其实浏览器也偷偷将该商品的id以cookie传回了浏览器):

  

我们访问商品显示页面再次【刷新】就可以看到刚才浏览过的商品了:

  

总结

以上がJava のサーブレットの Cookie についての簡単な紹介 (画像とテキスト)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
Javaのプラットフォームの独立性を脅かしたり強化したりする新しいテクノロジーはありますか?Javaのプラットフォームの独立性を脅かしたり強化したりする新しいテクノロジーはありますか?Apr 24, 2025 am 12:11 AM

新しいテクノロジーは、両方の脅威をもたらし、Javaのプラットフォームの独立性を高めます。 1)Dockerなどのクラウドコンピューティングとコンテナ化テクノロジーは、Javaのプラットフォームの独立性を強化しますが、さまざまなクラウド環境に適応するために最適化する必要があります。 2)WebAssemblyは、Graalvmを介してJavaコードをコンパイルし、プラットフォームの独立性を拡張しますが、パフォーマンスのために他の言語と競合する必要があります。

JVMのさまざまな実装は何ですか、そしてそれらはすべて同じレベルのプラットフォームの独立性を提供しますか?JVMのさまざまな実装は何ですか、そしてそれらはすべて同じレベルのプラットフォームの独立性を提供しますか?Apr 24, 2025 am 12:10 AM

JVMの実装が異なると、プラットフォームの独立性が得られますが、パフォーマンスはわずかに異なります。 1。OracleHotspotとOpenJDKJVMは、プラットフォームの独立性で同様に機能しますが、OpenJDKは追加の構成が必要になる場合があります。 2。IBMJ9JVMは、特定のオペレーティングシステムで最適化を実行します。 3. Graalvmは複数の言語をサポートし、追加の構成が必要です。 4。AzulzingJVMには、特定のプラットフォーム調整が必要です。

プラットフォームの独立性は、開発コストと時間をどのように削減しますか?プラットフォームの独立性は、開発コストと時間をどのように削減しますか?Apr 24, 2025 am 12:08 AM

プラットフォームの独立性により、開発コストが削減され、複数のオペレーティングシステムで同じコードセットを実行することで開発時間を短縮します。具体的には、次のように表示されます。1。開発時間を短縮すると、1セットのコードのみが必要です。 2。メンテナンスコストを削減し、テストプロセスを統合します。 3.展開プロセスを簡素化するための迅速な反復とチームコラボレーション。

Javaのプラットフォームの独立性は、コードの再利用をどのように促進しますか?Javaのプラットフォームの独立性は、コードの再利用をどのように促進しますか?Apr 24, 2025 am 12:05 AM

java'splatformentedencefacilitatesecodereusebyAllowingbyTeCodeCodeCodeCodeTorunonAnyPlatformm.1)DevelopersConcodeCodeOnceOnceOnconconsentEntentEntEntEntEntEntentPlatforms.2)維持化されたアスカデドは、NoeedReadedoesではありません

Javaアプリケーションのプラットフォーム固有の問題をどのようにトラブルシューティングしますか?Javaアプリケーションのプラットフォーム固有の問題をどのようにトラブルシューティングしますか?Apr 24, 2025 am 12:04 AM

Javaアプリケーションのプラットフォーム固有の問題を解決するには、次の手順を実行できます。1。Javaのシステムクラスを使用して、システムプロパティを表示して実行中の環境を理解します。 2。ファイルクラスまたはjava.nio.fileパッケージを使用して、ファイルパスを処理します。 3。オペレーティングシステムの条件に応じてローカルライブラリをロードします。 4. VisualVMまたはJProfilerを使用して、クロスプラットフォームのパフォーマンスを最適化します。 5.テスト環境が、Dockerコンテナ化を通じて生産環境と一致していることを確認してください。 6. githubactionsを使用して、複数のプラットフォームで自動テストを実行します。これらの方法は、Javaアプリケーションでプラットフォーム固有の問題を効果的に解決するのに役立ちます。

JVMのクラスローダーサブシステムは、プラットフォームの独立性にどのように貢献していますか?JVMのクラスローダーサブシステムは、プラットフォームの独立性にどのように貢献していますか?Apr 23, 2025 am 12:14 AM

クラスローダーは、統一されたクラスファイル形式、動的読み込み、親代表団モデル、プラットフォーム非依存バイトコードを通じて、さまざまなプラットフォーム上のJavaプログラムの一貫性と互換性を保証し、プラットフォームの独立性を実現します。

Javaコンパイラはプラットフォーム固有のコードを作成しますか?説明する。Javaコンパイラはプラットフォーム固有のコードを作成しますか?説明する。Apr 23, 2025 am 12:09 AM

Javaコンパイラによって生成されたコードはプラットフォームに依存しませんが、最終的に実行されるコードはプラットフォーム固有です。 1。Javaソースコードは、プラットフォームに依存しないバイトコードにコンパイルされます。 2。JVMは、特定のプラットフォームのバイトコードをマシンコードに変換し、クロスプラットフォーム操作を保証しますが、パフォーマンスは異なる場合があります。

JVMは、さまざまなオペレーティングシステムでマルチスレッドをどのように処理しますか?JVMは、さまざまなオペレーティングシステムでマルチスレッドをどのように処理しますか?Apr 23, 2025 am 12:07 AM

マルチスレッドは、プログラムの応答性とリソースの利用を改善し、複雑な同時タスクを処理できるため、最新のプログラミングで重要です。 JVMは、スレッドマッピング、スケジューリングメカニズム、同期ロックメカニズムを介して、異なるオペレーティングシステム上のマルチスレッドの一貫性と効率を保証します。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、