쿠키 기술의 탄생 이후, 쿠키는 인터넷 사용자와 웹 개발자 사이에서 논쟁의 초점이 되었습니다. 다음 기사에서는 서블릿의 쿠키 도입에 대한 관련 정보를 주로 소개합니다. 기사의 소개는 매우 상세합니다. 도움이 필요한 친구들이 함께 살펴보겠습니다.
먼저 "대화"가 무엇인지 이해해 봅시다. 세션은 웹 기술의 용어입니다. 사용자가 브라우저를 열고 여러 하이퍼링크를 클릭하고 서버의 여러 웹 리소스에 액세스한 다음 브라우저를 닫는 것으로 간단히 이해할 수 있습니다.
브라우저를 열어 페이지를 방문한 다음 브라우저를 열어 동일한 페이지를 방문하는 경우 두 가지 세션이 있으며, 브라우저를 열어 페이지를 방문한 후 이 페이지의 하이퍼링크를 통해 열리면 새 브라우저를 사용하더라도 여전히 하나의 세션으로 계산됩니다.
모든 사용자는 브라우저와 서버 간의 대화 중에 필연적으로 일부 데이터를 생성하게 되며, 프로그램은 각 사용자를 위해 이 데이터를 저장할 방법을 찾아야 합니다. 예를 들어, 사용자가 상품 서블릿을 통해 상품을 구매하기 위해 하이퍼링크를 클릭했다면, 프로그램은 사용자가 결제 하이퍼링크를 클릭했을 때 결제 서블릿에서 해당 상품을 볼 수 있도록 상품을 저장할 수 있는 방법을 찾아야 하며, 그것을 지불하십시오.
상품 클릭과 결제를 위한 서블릿은 서로 다른 두 개의 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

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><pre class='brush:php;toolbar:false;'>public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter writer = response.getWriter();
writer.write("您上次访问的时间是:");
//获取用户上一次的访问时间并显示
Cookie[] cookies = request.getCookies(); //从请求中获取客户端发来的Cookie
for(int i=0;cookies!=null && i<cookies.length;i++) {
if(cookies[i].getName().equals("lastAccessTime")) { //获取最后访问时间的Cookie
Long mTime = Long.parseLong(cookies[i].getValue());
String lastAccessTime = new Date(mTime).toLocaleString();
writer.write(lastAccessTime);
}
}
//将本次登录时间重新装载进Cookie中并返回给客户端
Cookie timeCookie = new Cookie("lastAccessTime", System.currentTimeMillis()+"");
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<String,Product> map = new HashMap<String, Product>();
static{
map.put("1", new Product("1","《Java编程思想》","JB"));
map.put("2", new Product("2","《Java核心技术》","fdaf"));
map.put("3", new Product("3","《Java并发编程》","什么鬼"));
map.put("4", new Product("4","《Head first 设计模式》","老王"));
map.put("5", new Product("5","《HTML5权威手册》","hhaa"));
}
public static Map<String,Product> getMap() {
return map;
}
}</pre><p>做完了这两步,那么我们可以安心的去搞Servlet了,首先是在显示所有商品的Servlet:</p>
<p class="jb51code"><br></p><pre class='brush:php;toolbar:false;'>response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter writer = response.getWriter();
//从数据库中取出要显示在购物网站首页的商品
Map<String,Product> map = ProductDatabase.getMap();
if(map == null) {
writer.print("您访问的宝贝已下架");
return ;
}
for(Map.Entry<String, Product> en : map.entrySet()) {
writer.print("<a href=&#39;/CookieProductProject/servlet/DetailGoodServlet?id="+en.getKey()+"&#39; target=&#39;_blank&#39; >"
+en.getValue().getName()+" <br/>");
}
//显示用户之前浏览过的商品,要从用户发送的请求中的Cookie里取得
writer.print("<br/><br/>");
writer.print("您最近浏览过的商品: <br/>");
Cookie[] cookies = request.getCookies();
for(int i=0;cookies!=null && i<cookies.length;i++ ) {
if(cookies[i].getName().equals("productHistory")) {
Cookie cookie = cookies[i];
String productId = cookie.getValue();
String[] splitId = productId.split("\\_");
for(String sId:splitId) {
Product book = ProductDatabase.getMap().get(sId);
writer.print(book.getName()+"<br/>");
}
}
}
}</pre><p>最后是点击某个商品显示详细信息的Servlet:</p>
<p class="jb51code"><br></p><pre class='brush:php;toolbar:false;'>response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
PrintWriter writer = response.getWriter();
//通过用户点击商品的超链接而跟随URL来的ID参数来获取商品的详细信息
String productId = request.getParameter("id");
Map<String, Product> map = ProductDatabase.getMap();
Product book = map.get(productId);
writer.print("商品名:"+book.getName()+"<br />");
writer.print("作者:"+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의 서블릿 쿠키에 대한 간략한 소개(그림 및 텍스트)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

JVM은 Java 코드를 기계 코드로 변환하고 리소스를 관리하여 작동합니다. 1) 클래스로드 : .class 파일을 메모리에로드하십시오. 2) 런타임 데이터 영역 : 메모리 영역 관리. 3) 실행 엔진 : 해석 또는 컴파일 바이트 코드. 4) 로컬 메소드 인터페이스 : JNI를 통해 운영 체제와 상호 작용합니다.

JVM을 통해 Java는 플랫폼을 가로 질러 실행할 수 있습니다. 1) JVM 하중, 검증 및 바이트 코드를 실행합니다. 2) JVM의 작업에는 클래스 로딩, 바이트 코드 검증, 해석 실행 및 메모리 관리가 포함됩니다. 3) JVM은 동적 클래스 로딩 및 반사와 같은 고급 기능을 지원합니다.

Java 응용 프로그램은 다음 단계를 통해 다른 운영 체제에서 실행할 수 있습니다. 1) 파일 또는 경로 클래스를 사용하여 파일 경로를 처리합니다. 2) system.getenv ()를 통해 환경 변수를 설정하고 얻습니다. 3) Maven 또는 Gradle을 사용하여 종속성 및 테스트를 관리하십시오. Java의 크로스 플랫폼 기능은 JVM의 추상화 계층에 의존하지만 여전히 특정 운영 체제 별 기능의 수동 처리가 필요합니다.

Java는 다른 플랫폼에서 특정 구성 및 튜닝이 필요합니다. 1) 힙 크기를 설정하기 위해 -xms 및 -xmx와 같은 JVM 매개 변수를 조정하십시오. 2) 병렬 GC 또는 G1GC와 같은 적절한 쓰레기 수집 전략을 선택하십시오. 3) 다른 플랫폼에 적응하도록 기본 라이브러리를 구성하십시오. 이러한 측정을 통해 Java 응용 프로그램은 다양한 환경에서 가장 잘 수행 할 수 있습니다.

OSGI, APACHECMONSLANG, JNA, andJVMOPTIONSAREEFFICEPIPERINGLINGPLATFORM-SPECIFICCHALLENGENJAVA.1) OSGIMANAGESDENCENTENCENDISONDISOLATESCOMPONENTS.2) APACHECOMMONSLANGPROVIDEUTIOMITIONFUCTIONS.3) JNAALLOWSCALLINGNATIVECODE.4) JNAALLOWSCALTINGBEHAV

jvmmanagesgarbageCollectionAcrossplatformSefficialthegendercationalStrationallySticallySticallySuciationalStrationalSproachandAptingToosandHardwaredifferences.ITEMPLOYSVARIOUSCOLLECTORSLIKESERIAL, PARALING, CMS, 및 G1, 각각의 소지 firedFferentscenarios.performanceCanbetwithflags-xex : xa

Java의 "Write Onge, Run Everywhere"철학은 JVM (Java Virtual Machine)에서 구현되므로 Java Code는 수정없이 다른 운영 체제에서 실행할 수 있습니다. 컴파일 된 Java Bytecode와 운영 체제 사이의 중개자로서 JVM은 바이트 코드를 특정 시스템 지침으로 변환하여 프로그램이 JVM이 설치된 모든 플랫폼에서 독립적으로 실행될 수 있도록합니다.

Java 프로그램의 편집 및 실행은 Bytecode 및 JVM을 통해 플랫폼 독립성을 달성합니다. 1) Java 소스 코드를 작성하여 바이트 코드로 컴파일하십시오. 2) JVM을 사용하여 모든 플랫폼에서 바이트 코드를 실행하여 코드가 플랫폼에서 실행되도록합니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

VSCode Windows 64비트 다운로드
Microsoft에서 출시한 강력한 무료 IDE 편집기

SublimeText3 영어 버전
권장 사항: Win 버전, 코드 프롬프트 지원!

DVWA
DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

SecList
SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.
