HttpServletRequest
HttpServletRequest简介
.WEB客户端发送给WEB服务器的HTTP请求消息分为三个部分:
请求行 POST /demo/login HTTP/1.1
请求消息头
消息正文(也叫实体内容) username=xxxx&password=1234
.Servlet API中定义的ServletRequest接口类用于封装请求消息。
.HttpServletRequest是专用于HTTP协议的ServletRequest子接口,它用于封装HTTP请求消息。
.在service()方法内部调用HttpServletRequest对象的各种方法来获取请求消息。
获取请求行的相关信息
.HTTP请求消息的请求行包括请求方式、资源路径和HTTP协议版本:
GET /it315/servlet/RequestURI?param1=a¶m2=b HTTP/1.1
.getMethod方法返回HTTP请求消息中的请求方式。
.getRequestURI方法返回请求行中的资源名部分。
.getQueryString 方法返回请求行中的参数部分。
.getProtocol方法返回请求行中的协议名和版本。
.getContextPath方法返回请求资源所属于的WEB应用程序的路径。
.getPathInfo方法返回请求URL中的额外路径信息。额外路径信息是请求URL中的位于Servlet的路径之后和查询参数之前的内容,它以“/”开头。
.getPathTranslated方法返回URL中的额外路径信息所对应的资源的真实路径。
.getServletPath方法返回Servlet的名称或Servlet所映射的路径。
获取网络连接信息
.getRemoteAddr方法返回发出请求的客户机的IP地址,其格式为“192.168.0.3”这种形式的字符文本。 (*)
.getRemoteHost方法返回发出请求的客户机的完整主机名,即“pc1.it315.org”这种格式。
.getRemotePort方法返回发出请求的客户机所使用的网络接口的端口号。
.getLocalAddr方法返回WEB服务器上接收当前请求的网络接口的IP地址。
.getLocalName方法返回WEB服务器上接收当前请求的网络接口的IP地址所对应的主机名。
.getLocalPort方法返回WEB服务器上接收当前请求的网络接口的端口号。
.getServerName方法返回当前请求所指向的主机名。
.getServerPort方法返回当前请求所连接的服务器端口号。
.getScheme方法返回请求的协议名,例如http、https或ftp。
.getRequestURL方法返回客户端发出请求时的完整URL。
会话与状态管理
什么是Cookie
.Cookie是一种在客户端保持HTTP状态信息的技术,它好比商场发放的优惠卡。
.Cookie是在浏览器访问WEB服务器的某个资源时,由WEB服务器在HTTP响应消息头中附带传送给浏览器的一片数据,WEB服务器传送给各个客户端浏览器的数据是可以各不相同的。
.一旦WEB浏览器保存了某个Cookie,那么它在以后每次访问该WEB服务器时,都应在HTTP请求头中将这个Cookie回传给WEB服务器。
.WEB服务器通过在HTTP响应消息中增加Set-Cookie响应头字段将Cookie信息发送给浏览器,浏览器则通过在HTTP请求消息中增加Cookie请求头字段将Cookie回传给WEB服务器。
.一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。
.一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的Cookie。
.浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。
Cookie请求头字段
.浏览器使用Cookie请求头字段将Cookie信息回送给WEB服务器。
.多个Cookie信息通过一个Cookie请求头字段回送给WEB服务器。
.浏览器根据下面的几个规则决定是否发送某个Cookie信息:
请求的主机名是否与某个存储的Cookie的Domain属性匹配;
请求的端口号是否在该Cookie的Port属性列表中;
请求的资源路径是否在该Cookie的Path属性指定的目录及子目录中;
该Cookie的有效期是否已过。
.Cookie请求头字段中的每个Cookie之间用逗号(,)或分号(;)分隔。
.在Cookie请求头字段中除了必须有“名称=值”的设置外,还可以有Version、Path、Domain、Port等几个属性。
.在Version、Path、Domain、Port等属性名之前,都要增加一个“$”字符作为前缀。
.Version属性只能出现一次,且要位于Cookie请求头字段设置值的最前面,如果需要设置某个Cookie信息的 Path、Domain、Port等属性,它们必须位于该Cookie信息的“名称=值”设置之后。
.Path属性指向子目录的Cookie排在Path属性指向父目录的Cookie之前。
举例:Cookie: $Version=1; Course=Java; $Path=/it315/lesson; Course=vc; $Path=/it315
Cookie的综合实例实践
Cookie ckName = new Cookie("name",name);
Cookie ckNickname = new Cookie("nickname",nickname);
ckNickname.setMaxAge(365*24*3600);
Cookie ckEmail = new Cookie("email","test1@it315.org");
Cookie ckPhone =
new Cookie("phone","1111111");
response.addCookie(ckName);
response.addCookie(ckNickname);
response.addCookie(ckEmail);
response.addCookie(ckPhone);
String lastNickname = null;
Cookie [] cks = request.getCookies();
for(int i=0; cks!=null && i<cks.length; i++)
{
if("nickname".equals(cks[i].getName()))
{
lastNickname = cks[i].getValue();
break;
}
}
if(lastNickname != null)
{
out.println("欢迎您," + lastNickname );
}
什么是Session
.使用Cookie和附加URL参数都可以将上一次请求的状态信息传递到下一次请求中,但是如果传递的状态信息较多,将极大降低网络传输效率和增大服务器端程序处理的难度。
.Session技术是一种将会话状态保存在服务器端的技术 ,它可以比喻成是医院发放给病人的病历卡和医院为每个病人保留的病历档案的结合方式 。
.客户端需要接收、记忆和回送 Session的会话标识号,Session可以且通常是借助Cookie来传递会话标识号。
Application 与session域范围的属性比较实践
HttpSession session = request.getSession();
Integer sessionCount = (Integer)session.getAttribute("count");
int count = 0;
if(sessionCount != null)
{
count = sessionCount.intValue();
}
out.println("当前会话中发生了" + (++count) + "次访问<br>");
session.setAttribute("count",new Integer(count));
count = 0;
ServletContext application = getServletContext();
Integer applicationCount = (Integer)application.getAttribute("count");
if(applicationCount != null)
{
count = applicationCount.intValue();
}
out.println("WEB应用程序中发生了" + (++count) + "次访问<br>");
application.setAttribute("count",new Integer(count));