Cookie、Session 与 application
由于Http协议是无连接性的协议,即每次只访问服务器一次,然后断开连接,在跳转页面时,会导致信息丢失。这时候,Cookie和Session就解决了这个问题。application则是服务器端的一块内存区域,各个客户端访问的是同一个application。这里以Java语言为例。
Cookie:
1.Cookie是储存在客户端的文件,存储名值对(类似Map)。
2.Cookie是服务器在客户端写的文本文档。
3.客户端可以阻止服务器在客户端写入Cookie。
4.服务器可以读取客户端的Cookie,但仅限于Webapp自己写入客户端的Cookie。
5.Cookie可以区分浏览器。
6.Cookie有生存周期,可以通过setMaxAge(arg)的方式设置Cookie生存周期,没有设置生存周期的Cookie随浏览器关闭而结束生命周期。
7.Cookie在设置Cookie的当前目录或者子目录(该目录指的是POM.XML中的URL)中有效,或者浏览器子窗口中有效。
新建Cookie:
import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.http.*;
public class SetCookies extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
//新建一个Cookie
Cookie cookie = new Cookie("Session-cookie", "svalue");
//通过response对象向客户端中添加Cookie
response.addCookie(cookie);
cookie = new Cookie("Persistent-cookie", "pvalue");
cookie.setMaxAge(3600);
response.addCookie(cookie);
PrintWriter out = response.getWriter();
out.println("<a href='ShowCookies'>ShowCookies</herf>");
}
}
显示Cookie:
import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.http.*;
public class ShowCookies extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
//设置反馈给客户端的内容
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
//通过req对象获得客户端所携带的Cookie
Cookie[] cookies = req.getCookies();
if(cookies.length > 0){
for(Cookie cookie : cookies){
out.println(cookie.getName()+ " " + cookie.getValue());
}
}
}
}
Session:
1.Session是记录在服务器端的一系列的用户操作信息,是服务器端开辟的一块内存。
2.Session是与创建Session浏览器的窗口或者浏览器的子窗口关联在一起,其它浏览器无法访问该Session。
3.每个Session都有一个SessionId,每次客户端携带着SessionId获得他独有的Session。
4.Session可以通过两种方式实现,一种是通过Cookie实现(SessionId存储在临时Cookie中),另一种是通过重写URL实现(response.encodeURL();转码+URL后面加入SessionId)。
5.浏览器窗口关闭后,该Session就消失了。
常用代码如下:
import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.http.*;
public class ShowSession extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
resp.setContentType("text/html");
HttpSession session = req.getSession(true);
if(session.getAttribute("cnt") == null){
session.setAttribute("cnt", 0);
}else{
session.setAttribute("cnt", (Integer)session.getAttribute("cnt") + 1);
}
PrintWriter out = resp.getWriter();
out.println((Integer)session.getAttribute("cnt"));
out.println("<br>" + session.getId());
}
}
import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.http.*;
public class SessionInfo extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
HttpSession session = req.getSession(true);
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
out.println("is new? " + session.isNew());
out.println("id? " + session.getId());
out.println("create time? " + session.getCreationTime());
out.println("last access time ?" + session.getLastAccessedTime());
out.println("id from req ?" + req.getRequestedSessionId());
out.println("cookie ? " + req.isRequestedSessionIdFromCookie());
out.println("URL ? " + req.isRequestedSessionIdFromURL());
out.println("<a href=" + resp.encodeURL("SessionInfo") + "></a>");
}
}
application:
application其实是ServletContext对象,指的是整个webapp,不同的客户端访问的是同一个application。
下面是一个计数器,计数所有客户端的次数。
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class TestApplication extends HttpServlet{
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
ServletContext application = this.getServletContext();
Integer count = (Integer) application.getAttribute("count");
if(count == null){
count = 1;
}else{
count = (Integer) application.getAttribute("count");
}
application.setAttribute("count", count + 1);
out.println(count);
}
}