Cookie とセッションはどちらもユーザーのアクセス状態を維持するために使用され、一方ではビジネスの実装を容易にし、他方ではサーバー側のプログラム設計を簡素化し、アクセスのパフォーマンスを向上させます。 Cookie はクライアント側 (つまり、ブラウザ側) のテクノロジであり、Cookie を設定すると、サーバーにアクセスするたびに、その Cookie がリクエストに含まれます。セッションは、ユーザーのアクセス情報を保存するサーバー側のテクノロジです。サーバー上で。
Cookie を使用して情報を転送すると、Cookie の数が増加し、訪問数が増加すると、より多くの帯域幅が占有されます。セッションを使用して情報を保存すると、最大の弱点は、複数のサーバー間で共有するのが簡単ではないことです。 。
1 Cookie
簡単に言うと、ユーザーが HTTP を使用してサーバーにアクセスすると、サーバーはいくつかのキーと値のペアの情報をクライアントのブラウザーに返し、制限が満たされている場合はデータにいくつかの制限を追加します。ユーザーがサーバーにアクセスすると、以前に設定された Cookie のキーと値のペアの情報が取得されます。ユーザーが URL を入力すると、ブラウザはローカル ハード ドライブ上でその URL に関連付けられた Cookie を探します。 Cookie が存在する場合、ブラウザはページ リクエストとともに Cookie をサイトに送信します。
Cookieは特定のページではなく、Webサイトに関連付けられます。したがって、ユーザーがサイト内のどのページをリクエストしても、ブラウザとサーバーは Cookie 情報を交換します。ユーザーが異なるサイトにアクセスすると、各サイトがユーザーのブラウザに Cookie を送信する場合があり、ブラウザはすべての Cookie を個別に保存します。
Cookie 属性項目
現在、Cookie にはバージョン 0 とバージョン 1 の 2 つのバージョンがあります。これらには、「Set-Cookie」と「Set-Cookie2」という 2 つのセット応答ヘッダー識別子があります。
Cookie 0の属性値
Cookie 1の属性値
JavaでのCookieの使用例
@Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); Cookie[] cookies = request.getCookies(); String name = getCoodie(cookies, "name"); if (name == null) { response.addCookie(new Cookie("name", "luoxn28")); } else { System.out.println(name); } out.println("hello world"); } public static String getCoodie(Cookie[] cookies, String key) { if (cookies != null) { for (Cookie cookie : cookies) { if (cookie.getName().equals(key)) { return cookie.getValue(); } } } return null; }
Cookieの使用に関する注意事項(Javaを例にします)
•作成された Cookie の名前と値は非 ASSIC 文字であってはなりません。中国語の場合は RRLEncoder でエンコードできます。それ以外の場合は、java.lang.IllegalArgumentException 例外がスローされます。
•複数の名前と値の値が表示される場合、それらは実際には同じ「Cookie」ヘッダー内にあります。
•「;」以外の句読点もCookieの値に保存できます。ただし、漢字は保存できません。漢字を保存すると文字化けが発生します。
Cookie のいくつかの制限
Cookie は HTTP ヘッダー内のフィールドです。HTTP 自体にはこのフィールドに対する制限はありませんが、Cookie は最終的にブラウザーに保存されます。以下に示すように、Cookie の保存にはいくつかの制限があります。以下の表に表示:
さらにCookieを保存しようとすると、最も古いCookieが破棄されます。
2 Session
Session は、Cookie の数が増えると、同じクライアントがサーバーと対話するときに、すべてを返す必要がなく、クライアントとサーバー間のデータ送信量が増加するという問題を解決します。この ID は、クライアントが初めてサーバーにアクセスしたときに生成され、通常は JSESSIONID という名前の Cookie です。
セッションは Cookie に基づいてどのように機能しますか? URL パス パラメーターに基づいて動作することもできますが、Context コンテナーの Cookie 識別子が変更されていない場合は、デフォルトでサポートされます。ブラウザが Cookie 機能をサポートしていない場合、ブラウザはユーザーの SessionCookieName をユーザーが要求した URL パラメータに書き換え、その配信方法は /path/Servlet;name=xxx;name2=xxx2?name3=xxx3 のようになります。 SessionCookieName session-config 構成項目が web.xml で構成されている場合、cookie-config の下の name 属性は、この SessionCookieName の値になります。 session-config 構成項目が構成されていない場合、デフォルトの SessionCookieName は「JSESSIONID」です。セッションに関連付けられた Cookie は他の Cookie と何ら変わらないことに注意してください。クライアントが Cookie もサポートしている場合でも、Tomcat は Cookie 内のセッション ID を解析し、URL 内のセッション ID を上書きします。
セッションの仕組み
有了Session ID,服务器就可以创建HttpSession对象了,第一次调用request.getSession()方法,如果没有对应的HttpSession对象,则会创建一个新的,并将这个对象加入到org.apache.catalina.Manager的sessions容器中保存。Manage保存所有的session生命周期,Session过期被回收,服务器关闭,Session被序列化到磁盘。注意,一个客户端对应一个Session对象,这个对象正是保存我们创建的Session值的。
request.getSession()方法调用的StandardSession永远都会存在,即使与这个客户端关联的Session已经过期。如果过期,则会创建一个新的,但是以前设置的Session值将会丢失。
3 Cookie与Session安全性比较
Cookie将保存的数据通过HTTP头部从客户端传到服务端,从服务端再传回到客户端,所有的数据都保存在客户端浏览器中,这些数据都是可以访问到的,甚至可以通过插件添加、修改Cookie,所有Cookie的安全性是比较差的。相比较而言,Session将数据保存在服务器端,安全性高很多,只需要Cookie传回一个Cookie ID就可以,所以Session更适合保存用户隐私和重要的数据。
分布式Session框架
在大型互联网应用中,单用Cookie和Session都是不可行的,因为如果使用Cookie可以很好地解决应用的分布式部署问题,大型互联网应用系统一个应用有上百台机器,而且有很多不同的应用系统协同工作,由于Cookie是将数据存储在用户浏览器中,用户每次访问都会讲数据带回到服务器,也就解决了同一个用户的请求在不同服务器上处理而导致的Cookie不一致问题。
由于应用是一个集群,所以不能将Session都保存在每台服务器的内存中,如果每台服务器有几十万访问用户,服务器内存也容不下,即使容得下,也无法保证该Session同步到其他服务器中,所以共享这些Session需要将它们保存在专门的分布式缓存中,可以随时读取和写入,性能要够好满足要求,如memcache/redis或者淘宝的开源分布式框架Tair都是很好的选择。
表单重复提交问题
网站中有很多地方有重复提交表单问题,为了防止表单重复提交,就要标识用户的每一次访问请求,使得每一次访问请求对服务端来说都是唯一的,为了标识用户的每次请求,可以在用户请求的表单域增加一个隐藏表单项,其值为唯一的token,如:
<form id="form" method="post"> ... <input type=hidden name="token" value="xxx"/> </form>
用户请求表单时生成唯一的token,并且设置到该用户的Session中,等用户提交时检测这个token是否和Session中保存的token一致,如果一致,说明没有重复提交,同时把Session中的token更新成一个新的token值;否则用户提交上来的token已经不是当前请求的合法token,提交失败。
以上所述是小编给大家介绍的JavaのCookieとセッションについて,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对PHP中文网的支持!
更多JavaのCookieとセッションについて相关文章请关注PHP中文网!

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

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

SAP NetWeaver Server Adapter for Eclipse
Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

SublimeText3 英語版
推奨: Win バージョン、コードプロンプトをサポート!

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター

Dreamweaver Mac版
ビジュアル Web 開発ツール
