IDEA新建一个不取名的empty项目,建好后新建一个名为Cookie_Demo的maven模块,本文结构图如下
pom.xml文件配置如下
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>org.examplegroupId>
<artifactId>Cookie_DemoartifactId>
<version>1.0-SNAPSHOTversion>
<packaging>warpackaging>
<properties>
<maven.compiler.source>8maven.compiler.source>
<maven.compiler.target>8maven.compiler.target>
properties>
<dependencies>
<dependency>
<groupId>javax.servletgroupId>
<artifactId>javax.servlet-apiartifactId>
<version>4.0.1version>
<scope>providedscope>
dependency>
<dependency>
<groupId>javax.servlet.jspgroupId>
<artifactId>jsp-apiartifactId>
<version>2.2version>
<scope>providedscope>
dependency>
<dependency>
<groupId>jstlgroupId>
<artifactId>jstlartifactId>
<version>1.2version>
dependency>
<dependency>
<groupId>taglibsgroupId>
<artifactId>standardartifactId>
<version>1.1.2version>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.mavengroupId>
<artifactId>tomcat7-maven-pluginartifactId>
<version>2.2version>
plugin>
plugins>
build>
project>
package com.diy.web.cookie;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet("/aServlet")
public class aServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//first attempt to transit cookies
Cookie ck = new Cookie("username", "luo_xiang");
/**
* Cookie live time , by second here is 60*60*24*7 = 604800s, means one week
* you can also put a 60*60*24*7 in (), but it will need cpu calculating once
* for high performance, here prefer put 604800
*/
ck.setMaxAge(604800);
response.addCookie(ck);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
建第二个
package com.diy.web.cookie;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet("/bServlet")
public class bServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// receive cookie
Cookie[] cks = request.getCookies();
for (Cookie ck : cks) {
String name = ck.getName();
if ("username".equals(name)){
String value = ck.getValue();
System.out.println(name + ":" + value);
break;
}
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
运行tomcat,浏览器访问项目路径加第一个servlet的访问路径,访问之前打开开发者页面
看到响应头已经有set-cookie了
访问第二个servlet的路径,就看到IDEA的控制台输出cookie里存储的数据了
ck.setMaxAge(604800);
该语句设置cookie的存活时间,正数是寿命,0是删除该cookie,浏览器默认是负数,即当浏览器关闭,发送的cookie被删除
这张图中看到服务器响应的cookie,过期时间,和浏览器请求时携带的cookie
cookie中存储中文时,需要转码,否则发给浏览器,浏览器再携带该cookie访问服务端资源时,服务端得到的将是乱码
第三个servlet
package com.diy.web.cookie;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
@WebServlet("/cServlet")
public class cServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/**
* deposit 中文 in Cookie, you need encoding by yourself
*/
String name = "羅翔";
name = URLEncoder.encode(name,"utf-8");
System.out.println("deposit nameCookie by C: "+ name);
Cookie ck = new Cookie("username", name);
ck.setMaxAge(604800);
response.addCookie(ck);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
第四个servlet
package com.diy.web.cookie;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
@WebServlet("/dServlet")
public class dServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// receive cookie
Cookie[] cks = request.getCookies();
for (Cookie ck : cks) {
String name = ck.getName();
if ("username".equals(name)){
String value = ck.getValue();
value = URLDecoder.decode(value,"utf-8");
System.out.println("receive nameCookie by D: " + value);
break;
}
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
重启tomcat,浏览器访问第三个servlet会得到cookie,然后浏览器再访问第四个servlet携带cookie
含有中文的cookie发送时为16进制码
手动用utf-8编码发送给浏览器的cookie,再从浏览器那里获取后,手动utf-8解码,就得到原来存入的正确的汉字信息
package com.diy.web.session;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet("/demo1")
public class SessionServletDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//get session object
HttpSession sess = request.getSession();
//deposit data, the value type is object, so any type is ok
sess.setAttribute("accountId", "jason_bourne");
System.out.println("Print from demo1: "+sess);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
二
package com.diy.web.session;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/demo2")
public class SessionServletDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//get session object
HttpSession sess = request.getSession();
/**
* this statement will kill session itself
* sess.invalidate();
* can use at user logout timing
*/
System.out.println("Print from demo2: "+sess);
//receive data
Object accountId = sess.getAttribute("accountId");
System.out.println(accountId);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
访问demo1会看到服务器响应了一个JSESSIONID的cookie,所以说服务器维持会话其实就是基于它发送给浏览器的cookie
访问demo2会看到这个JSESSIONID已经携带进请求的cookie里了
并且demo1在session里存入的数据,当demo2被访问之后,也按照代码被输出了
给demo1和demo2加上直接输出session对象地址的sout可以看到地址一样
在浏览器的设置中找localhost发来的cookie也可以看到有相应的JSESSIONID
切换Terminal页面,在本项目路劲下输入mvn tomcat7:run启动项目
浏览器访问demo1
Ctrl+C正常关闭tomcat
这时在项目的target目录下的如下地址
会看见ser文件,服务器重启后会立刻自动删除
mvn tomcat7:run启动tomcat
浏览器访问demo2
输出内容正确输出
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
web-app>
关闭session,可在servlet中写上下面注释中的代码
/**
* this statement will kill session itself
* sess.invalidate();
* can use at user logout timing
*/
完