쿠키와 세션은 모두 사용자의 액세스 상태를 유지하는 데 사용되며, 한편으로는 비즈니스 구현을 용이하게 하고, 다른 한편으로는 서버 측 프로그램 설계를 단순화하고 액세스 성능을 향상시킵니다. 쿠키는 클라이언트 측(즉, 브라우저 측) 기술로, 쿠키를 설정한 후 서버에 접속할 때마다 쿠키가 요청에 포함되며, 세션은 사용자의 접속 정보를 담고 있습니다. 서버에 저장됩니다.
쿠키는 정보를 전송하는 데 사용됩니다. 쿠키의 개수가 늘어나고 방문 횟수가 늘어날수록 쿠키가 차지하는 대역폭이 점점 커지게 됩니다. 정보를 저장하기 위해 세션을 사용할 때 가장 큰 약점은 바로 이것입니다. 서버 간에 공유되는 여러 장치에 정보를 저장하는 것이 쉽지 않습니다.
쿠키 1개
일반 용어로 사용자가 HTTP를 사용하여 서버에 액세스하면 서버는 일부 키-값 쌍 정보를 클라이언트 브라우저에 반환하고 다음을 제공합니다. 데이터에 일부 제한 사항이 추가됩니다. 제한 사항이 충족되면 사용자가 다음에 서버에 액세스할 때 이전에 설정한 쿠키 키-값 쌍 정보가 함께 가져옵니다. 사용자가 URL을 입력하면 브라우저는 로컬 하드 드라이브에서 해당 URL과 연결된 쿠키를 찾습니다. 쿠키가 존재하는 경우 브라우저는 페이지 요청과 함께 쿠키를 귀하의 사이트로 보냅니다.
쿠키는 특정 페이지가 아닌 웹사이트와 연관되어 있습니다. 따라서 사용자가 사이트의 어떤 페이지를 요청하더라도 브라우저와 서버는 쿠키 정보를 교환합니다. 사용자가 다른 사이트를 방문하면 각 사이트는 사용자의 브라우저에 쿠키를 보낼 수 있으며, 브라우저는 모든 쿠키를 별도로 저장합니다.
쿠키 속성 항목
현재 쿠키에는 버전 0과 버전 1의 두 가지 버전이 있습니다. 여기에는 "Set-Cookie"와 "Set-Cookie"라는 2개의 응답 헤더 식별자가 있습니다. "세트 쿠키2".
쿠키 0 속성 값
쿠키 1 속성 값
Java에서 쿠키 사용 예
@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; }
쿠키 사용에 대한 몇 가지 참고 사항(Java 사용을 예로 들어)
•생성된 쿠키의 이름 및 값 ASSIC 문자가 아닌 경우 중국어인 경우 RRLEncoder로 인코딩할 수 있습니다. 그렇지 않으면 java.lang.IllegalArgumentException 예외가 발생합니다.
•이름과 값 값이 여러 개 나타나는 경우 실제로는 동일한 "쿠키" 헤더에 있는 것입니다.
•";" 이외의 구두점은 쿠키 값에 저장될 수 있습니다. 하지만 한자는 저장할 수 없습니다. 한자를 저장할 때 글자가 깨져서 나타납니다.
쿠키의 일부 제한 사항
쿠키는 HTTP 헤더의 필드입니다. HTTP 자체에는 이 필드에 대한 제한이 없지만 쿠키는 궁극적으로 브라우저에 저장됩니다. 다음 표와 같이 브라우저마다 쿠키 저장에 몇 가지 제한이 있습니다.
더 많은 쿠키를 저장하려고 하면 가장 오래된 쿠키는 삭제됩니다.
2세션
동일한 클라이언트일 때 쿠키 개수가 늘어나면 클라이언트와 서버 사이의 데이터 전송량이 늘어나는 문제를 세션에서 해결합니다. 서버와 상호 작용하므로 매번 모든 쿠키 값이 반환되지만 ID 값은 하나만 반환됩니다. 이 ID는 클라이언트가 처음 서버에 액세스할 때 생성되며 각 클라이언트마다 고유합니다. 이 ID는 일반적으로 JSESSIONID라는 이름입니다.
세션은 쿠키를 기반으로 어떻게 작동합니까? URL 경로 매개변수를 기반으로 할 수도 있습니다. 컨텍스트 컨테이너의 쿠키 로고가 수정되지 않으면 지원됩니다. 기본. 브라우저가 쿠키 기능을 지원하지 않는 경우 브라우저는 사용자가 요청한 URL 매개변수에 사용자의 SessionCookieName을 다시 작성하며 전달 방법은 /path/Servlet;name=xxx;name2=xxx2?name3=xxx3과 같습니다. SessionCookieName session-config 구성 항목이 web.xml에 구성된 경우 cookie-config 아래의 name 속성은 SessionCookieName의 값입니다. session-config 구성 항목이 구성되지 않은 경우 기본 SessionCookieName은 "JSESSIONID"입니다. 세션과 관련된 쿠키는 다른 쿠키와 다르지 않습니다. 클라이언트가 쿠키도 지원하는 경우 Tomcat은 여전히 쿠키의 세션 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의 쿠키 및 세션에 관한 사항,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对PHP中文网的支持!
更多Java의 쿠키 및 세션에 관한 사항相关文章请关注PHP中文网!