1.cookie
简单来说,浏览器通过给用户一个cookie的方式,存储一定的信息,代表用户曾经访问过。
? ? ? ? 1.2 cookie 储存信息
自定义servlet类:
public class CookieDemo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter out = resp.getWriter();
resp.setContentType("text/html");
//获取Cookie对象,由请求(客户端)获得
Cookie[] cookies = req.getCookies();//可能存在多个cookie
//判断cookie是否存在
if (cookies != null){
//如果存在
out.print("last visit time is:");
for (int i = 0; i < cookies.length; i++) {
Cookie cookie = cookies[i];
//获取cookie的名字
if(cookie.getName().equals("lastLoginTime")){
//获取cookie的值
String value = cookie.getValue();
long lastLoginTime = Long.parseLong(value);
Date date = new Date(lastLoginTime);
//写出
out.write(date.toLocaleString());
}
}
}else {
out.print("this is your first visit");
}
//服务器给客户端响应Cookie
Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + "");
//给cookie设置有效期为1天
cookie.setMaxAge(24*60*60);
resp.addCookie(cookie);//返回上一次登录页面的时间
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
? ? ? ? 对于这个类,只需要知道他的核心功能:记录用户数据。记录用户的上次访问时间,如果没有,则显示this is your first visit;若已经访问过,则返回上次访问的时间。
? ? ? ? 我们来看看Cookie类:
?????????通过new Cookie(String name,String value)来新建cookie对象。注意:值的类型只能是String类型。
? ? ? ? 可以给该cookie设置存在的有效时长setMaxAge(minutes)。
? ? ? ? resp.addCookie(cookie)给响应添加cookie。
? ? ? ? req.getCookies()则是获取所有添加的cookie,可以有多个,返回值为一数组。
? ? ? ? cookie.getValue():取出cookie中的值
就这样我们能向网站中存储cookie、也可以取得他们。下面来一个例子。
servlet类:
public class Cookie01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//新建cookie
Cookie cookie1 = new Cookie("username", "Helen");
Cookie cookie2 = new Cookie("password", "Helenxx");
//response添加cookie
resp.addCookie(cookie1);
resp.addCookie(cookie2);
//request获取cookie
Cookie[] cookies = req.getCookies();
PrintWriter writer = resp.getWriter();
//写出
for (int i = 0; i < cookies.length; i++) {
writer.write(cookies[i].getValue() + "\n");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
注册servlet:
<servlet>
<servlet-name>cookie0</servlet-name>
<servlet-class>com.leo.servlet.Cookie01</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>cookie0</servlet-name>
<url-pattern>/ck1</url-pattern>
</servlet-mapping>
结果:
? ? ? ? 可见我们所储存的cookie已经成功取出。前2个cookie则是打开浏览器时自带的cookie。
????????1.3 删除cookie
已经储存的cookie,我们可以删除它。只需要用到一个步骤。
自定义servlet类:
public class CookieDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//要删除的cookie必须与之前的name一致
Cookie cookie1 = new Cookie("username", "Helen");
cookie1.setMaxAge(0);
resp.addCookie(cookie1);
Cookie cookie2 = new Cookie("password", "Helenxx");
cookie2.setMaxAge(0);
resp.addCookie(cookie2);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
? ? ? ? 要删除某个cookie只需要将他的作用时间设置为0就可以。
注册servlet:
<servlet>
<servlet-name>cookie2</servlet-name>
<servlet-class>com.leo.servlet.CookieDemo2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>cookie2</servlet-name>
<url-pattern>/c2</url-pattern>
</servlet-mapping>
结果:
? ? ? ? 我们先进入ck1:
?cookie正确取出没毛病。
? ? ? ? 在进入c2:
空白页面。?
? ? ? ? 再进ck1:
可以发现,2个指定的cookie已经删除成功。
2.session?
? ? ? ? 2.1 何为session?
session(计算机术语)_百度百科 (baidu.com),简单来说,一个session就是当用户打开浏览器,访问多个URL连接后,关闭浏览器的过程,只要浏览器不关闭,这个session就一直存在。必须是这个完整的过程。
? ? ? ? 2.2 session储存数据
session也和cookie一样,可以储存数据。不过session中存储数据的保持时间更长。
自定义servlet类:
public class SessionDemo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决乱码
req.setCharacterEncoding("gbk");
resp.setCharacterEncoding("gbk");
resp.setContentType("text/html,charset=gbk");
//获取session
HttpSession session = req.getSession();
HttpSession session1 = req.getSession();
//给session存数据
session.setAttribute("name",new Person("郦道元","男",244));
//获取session的ID
String sessionId = session.getId();
String session1Id = session1.getId();
resp.getWriter().write(sessionId+"\t"+session1Id);
//判断session是否为新创建的
if (session.isNew()){
resp.getWriter().write("new session id:" + sessionId);
} else {
resp.getWriter().write("existed session, id:" + sessionId);
}
//session在创建时作了什么事?
// Cookie cookie = new Cookie("JSESSIONID", sessionId);
// resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
? ? ? ? 首先,通过request.getSession()来获取session对象。可以获取多个session对象。
????????session.setAttribute方法给session存入数据。
?此方法与cookie储存数据不同,通过session储存的数据可以是任何类型,cookie只能是String类型。
? ? ? ? getId方法能够获取该session的id。
注册servlet:
<servlet>
<servlet-name>session</servlet-name>
<servlet-class>com.leo.servlet.SessionDemo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>session</servlet-name>
<url-pattern>/s1</url-pattern>
</servlet-mapping>
结果:
? ? ? ? ?发现,同一个servlet中,获取的sessionId是相同的,符合session的定义。
? ? ? ? 通过源代码发现,新建session的为?JSESSIONID,也是通过存储在cookie中。所以说创建session时发生了如上代码发生的事。
? ? ? ? 2.3 获取session储存的数据
servlet类:
public class SessionDemo02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决乱码
req.setCharacterEncoding("gbk");
resp.setCharacterEncoding("gbk");
resp.setContentType("text/html,charset=gbk");
//获取session
HttpSession session = req.getSession();
//session在创建时作了什么事?
// Cookie cookie = new Cookie("JSESSIONID", sessionId);
// resp.addCookie(cookie);
Person name = (Person) session.getAttribute("name");
System.out.println(name);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
? ? ? ? session.getAtrribute()来获取session储存的值,名称必须与set方法中的对应起来
结果:成功取出。
? ? ? ? ?2.4 清除session存储的数据:
servlet:
public class SessionDemo03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
session.removeAttribute("name");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
? ? ? ? 通过session.removeAttribute()方法清除数据,里面填入想清除的name。
注册:
<servlet>
<servlet-name>session3</servlet-name>
<servlet-class>com.leo.servlet.SessionDemo03</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>session3</servlet-name>
<url-pattern>/s3</url-pattern>
</servlet-mapping>
结果:先进s1,存入数据;在进入s2查看数据,进入s3清除数据后在进入s2查看:
?
?进不去了,根据错误信息可以看到,刚才存入的数据为null,说明已经被清除了。
? ? ? ? 2.5 清除session
如何让一个session被清除?使用以下方法
session.invalidate();
测试:先进入到s1、然后s3清除,在回到s1:
先进入s1:
?进入s3后在进入s1:
?可以看见2此sessionId不一样。因为之前的session被invalidate方法清除后,再次通过浏览器访问时创建了新的session。
|