> Java > java지도 시간 > Java의 서블릿 쿠키에 대한 간략한 소개(그림 및 텍스트)

Java의 서블릿 쿠키에 대한 간략한 소개(그림 및 텍스트)

黄舟
풀어 주다: 2017-07-26 15:06:06
원래의
1659명이 탐색했습니다.

쿠키 기술의 탄생 이후, 쿠키는 인터넷 사용자와 웹 개발자 사이에서 논쟁의 초점이 되었습니다. 다음 기사에서는 서블릿의 쿠키 도입에 대한 관련 정보를 주로 소개합니다. 기사의 소개는 매우 상세합니다. 도움이 필요한 친구들이 함께 살펴보겠습니다.

 먼저 "대화"가 무엇인지 이해해 봅시다. 세션은 웹 기술의 용어입니다. 사용자가 브라우저를 열고 여러 하이퍼링크를 클릭하고 서버의 여러 웹 리소스에 액세스한 다음 브라우저를 닫는 것으로 간단히 이해할 수 있습니다.

 브라우저를 열어 페이지를 방문한 다음 브라우저를 열어 동일한 페이지를 방문하는 경우 두 가지 세션이 있으며, 브라우저를 열어 페이지를 방문한 후 이 페이지의 하이퍼링크를 통해 열리면 새 브라우저를 사용하더라도 여전히 하나의 세션으로 계산됩니다.

 모든 사용자는 브라우저와 서버 간의 대화 중에 필연적으로 일부 데이터를 생성하게 되며, 프로그램은 각 사용자를 위해 이 데이터를 저장할 방법을 찾아야 합니다. 예를 들어, 사용자가 상품 서블릿을 통해 상품을 구매하기 위해 하이퍼링크를 클릭했다면, 프로그램은 사용자가 결제 하이퍼링크를 클릭했을 때 결제 서블릿에서 해당 상품을 볼 수 있도록 상품을 저장할 수 있는 방법을 찾아야 하며, 그것을 지불하십시오.

  상품 클릭과 결제를 위한 서블릿은 서로 다른 두 개의 Request 요청 객체를 전송하기 때문에 Request 객체를 사용하여 데이터를 저장하는 것은 불가능하며, ServletContext 객체를 사용하면 전달을 사용하는 경우 이론적으로 여러 사용자에게 스레드 안전 문제가 발생합니다. 기능 가능하지만 사용자 경험이 크게 줄어들며 항목을 클릭할 때마다 비용을 지불하라는 메시지가 표시됩니다. 따라서 위의 요구사항을 바탕으로 세션 중에 생성된 데이터를 저장하는 기술에는 두 가지가 있습니다. 하나는 쿠키이고 다른 하나는 세션 기술입니다. 다음 장에서 소개하겠습니다.

이 기사에서는 주로 서블릿의 쿠키 기술에 대해 설명합니다. 쿠키 기술은 클라이언트측 기술이며, 프로그램은 각 사용자의 데이터를 쿠키 형태로 사용자의 해당 브라우저에 기록합니다. 사용자가 브라우저를 사용하여 서버에 액세스할 때 자신의 데이터를 가져오므로 웹 서버는 사용자 자신의 데이터를 처리합니다.

다음 그림은 세션 중 마지막 액세스 시간으로 쿠키를 설정하는 간단한 프로세스입니다.

쿠키 개체를 생성하는 것은 Java 개체를 생성하는 것만큼 간단합니다.

사용 시 전달합니다. 생성자 쿠키 이름과 값의 키-값 쌍을 입력하기만 하면 됩니다. 서버 측에서 브라우저에서 전송된 쿠키 데이터를 얻으려면 요청의 request.getCookies 메소드를 사용할 수 있습니다. 쿠키 배열을 얻기 위해 객체를 사용하고, 브라우저에 쿠키를 출력하려는 ​​경우 응답 객체의 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 메소드는 쿠키 객체의 이름을 얻는 데 사용됩니다. 🎜🎜 setValue 메소드와 getValue 메소드는 각각 Cookie 객체의 값을 설정하고 가져오는 데 사용됩니다. 🎜🎜 setMaxAge(intexpires) 메소드는 쿠키의 유효 기간을 설정하는 것입니다. 이 코드가 없으면 쿠키의 유효 기간은 한 세션 시간입니다. 브라우저가 닫히는 경우) 쿠키가 설정된 경우, 쿠키는 브라우저가 지정한 하드 디스크 파일에 저장되며, 이 기간 동안 귀하가 서버를 방문할 때마다 쿠키가 함께 전달됩니다. . 이 메소드 매개변수가 "0"으로 설정되면 서버는 브라우저에 쿠키를 삭제하도록 지시합니다. 🎜🎜 setPath 메소드는 쿠키 설정을 위한 유효한 경로입니다. 특정 특정 URL을 방문할 때만 쿠키가 전달됨을 나타냅니다. 웹 애플리케이션이 [myservlet]이라고 가정해 보겠습니다. setPath 메소드의 매개변수를 "/myservlet"으로 설정하면 웹 애플리케이션의 모든 리소스에 액세스하면 브라우저가 쿠키를 전송하게 됩니다. 매개변수가 "/myservlet/pages"로 설정된 경우 웹 애플리케이션의 [페이지] 아래 리소스에 액세스할 때만 쿠키를 가져오고, 웹 애플리케이션의 다른 리소스에 액세스하면 쿠키를 서버로 가져오지 않습니다. setPath 메소드를 설정하지 않으면 쿠키의 유효 경로는 기본적으로 쿠키 객체를 생성한 현재 프로그램이 있는 디렉터리로 설정됩니다. 쿠키 경로는 브라우저에서 사용됩니다(자세한 내용은 "서블릿 학습 웹 경로 문제" 참조). 🎜🎜 setDomain 메소드는 .sina.com과 같은 쿠키의 유효 도메인 이름을 설정하는 것입니다. code> (참고 앞에 점이 있습니다.) 브라우저가 도메인 이름에 액세스할 때 쿠키가 전달됨을 나타냅니다. 하지만 이제 브라우저는 안전하지 않다고 간주될 수 있는 이 기능을 기본적으로 완전히 차단하므로 거의 포기되었습니다. 🎜<p>  举例:我们访问某个Servlet,而在访问这个Servlet时会将当前访问时间作为Cookie中的值返回给客户端,同时下次再次访问该Servlet时,会显示上一次客户端来访问的时间:</p> <p class="jb51code"><br></p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:java;">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><div class="contentsignin">로그인 후 복사</div></div><p>第一次访问是没有Cookie的,所以看不到访问时间:</p><p style="text-align: center"><img alt="" style="max-width:90%" style="max-width:90%" src="https://img.php.cn/upload/article/000/000/194/98adc163f83cb489dcaf44ec21626730-3.png"/>  </p><p>但是我们通过HttpWatch观察Response响应包中的内容已经有了“Set-Cookie”响应头:</p><p style="text-align: center"><img alt="" style="max-width:90%" style="max-width:90%" src="https://img.php.cn/upload/article/000/000/194/720f344d77dead6a105696519b916df7-4.png"/>  </p><p>刷新后的第二次访问就可以看到了:</p><p style="text-align: center"><img alt="" style="max-width:90%" style="max-width:90%" src="https://img.php.cn/upload/article/000/000/194/720f344d77dead6a105696519b916df7-5.png"/>  </p><p>同时观察HttpWatch中Request请求包的“Cookie”请求头可以发现:</p><p style="text-align: center"><img alt="" style="max-width:90%" style="max-width:90%" src="https://img.php.cn/upload/article/000/000/194/720f344d77dead6a105696519b916df7-6.png"/>  </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><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:java;">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><div class="contentsignin">로그인 후 복사</div></div><p>我们还需要一个数据库来保存商品,这里我们先用一个类来来保存(数据库还没学嘛T_T!),保存数据采用Map集合,这是因为如果有检索会方便:</p><p class="jb51code"><br/></p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:java;">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><div class="contentsignin">로그인 후 복사</div></div><p>做完了这两步,那么我们可以安心的去搞Servlet了,首先是在显示所有商品的Servlet:</p><p class="jb51code"><br/></p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:java;">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><div class="contentsignin">로그인 후 복사</div></div><p>最后是点击某个商品显示详细信息的Servlet:</p><p class="jb51code"><br/></p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:java;">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><div class="contentsignin">로그인 후 복사</div></div><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의 서블릿 쿠키에 대한 간략한 소개(그림 및 텍스트)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿