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中文网!