深入体验Java Web开发内幕
一..获取请求行的相关信息
1.HTTP请求消息的请求行包括请求方式、资源路径和HTTP协议版本:
GET /it315/servlet/RequestURI?param1=a¶m2=b HTTP/1.1
2.getMethod方法返回HTTP请求消息中的请求方式。
3.getRequestURI方法返回请求行中的资源名部分。
4.getQueryString 方法返回请求行中的参数部分。
5.getProtocol方法返回请求行中的协议名和版本。
6.getContextPath方法返回请求资源所属于的WEB应用程序的路径。
7.getPathInfo方法返回请求URL中的额外路径信息。额外路径信息是请求URL中的位于Servlet的路径之后和查询参数之前的内容,它以“/”开头。
8.getPathTranslated方法返回URL中的额外路径信息所对应的资源的真实路径。
9.getServletPath方法返回Servlet的名称或Servlet所映射的路径。
二..获取网络连接信息
1. getRemoteAddr方法返回发出请求的客户机的IP地址,其格式为“192.168.0.3”这种形式的字符文本。 (*)
2.getRemoteHost方法返回发出请求的客户机的完整主机名,即“pc1.it315.org”这种格式。
3.getRemotePort方法返回发出请求的客户机所使用的网络接口的端口号。
4.getLocalAddr方法返回WEB服务器上接收当前请求的网络接口的IP地址。
5.getLocalName方法返回WEB服务器上接收当前请求的网络接口的IP地址所对应的主机名。
6.getLocalPort方法返回WEB服务器上接收当前请求的网络接口的端口号。
7.getServerName方法返回当前请求所指向的主机名。
8.getServerPort方法返回当前请求所连接的服务器端口号。
9.getScheme方法返回请求的协议名,例如http、https或ftp。
10.getRequestURL方法返回客户端发出请求时的完整URL。
三..获取请求头信息
1.getHeader方法
2.getHeaders方法
3.getHeaderNames方法
4.getIntHeader方法
5.getDateHeader方法
6.getContentType方法
7.getContentLength方法
8.getCharacterEncoding方法
四.. 获取所有请求头的编程实例
Enumeration headerNames = request.getHeaderNames();
while(headerNames.hasMoreElements())
{
String headerName = (String)headerNames.nextElement();
out.print(headerName + " : " + request.getHeader(headerName) + "<br>");
/*如果要考虑同一个请求头名可能出现多次,
那么应该用下面的代码段代替上面一行程序代码*/
/*Enumeration values = request.getHeaders(headerName);
while(values.hasMoreElements())
{
out.print(headerName + " : " + (String)values.nextElement() + "<br>");
}*/
}
地址栏中:http://localhost:8080/demo/servlet/test
请求消息:不包含消息头字段Referer
MyHtml.html
<a href="http://localhost:8080/demo/servlet/tes向
点击超链接,是向web服务器第二次发送了一个servlet请求
请求消息:包含Referer头字段.超链接所在的html页面的url地址
Referer:http://localhost:8080/demo/MyHtml.html
servlet:获取请求消息封装的Referer头字段
如果Referer字段的值为空:
如果不为空,
"http://"+request.getServerName()
http://localhost
五.利用Referer请求头阻止“盗链”
String referrer = request.getHeader("referer");
String sitePart = "http://" + request.getServerName();
if(referrer!=null && referrer.startsWith(sitePart))
{
//处理正当的下载请求,这里只进行示意
out.println("dealing download ...");
}
else
{
//非法下载请求跳转到本站的下载说明页
RequestDispatcher rd = request.getRequestDispatcher("/down.html");
rd.forward(request,response);
}
六..利用Referer请求头
隐藏JavaScript源码
String referrer = request.getHeader("referer");
String sitePart = "http://" + request.getServerName();
if(referrer!=null && referrer.startsWith(sitePart))
{
//向客户端输出javascript的document.write(...)语句
out.println(
"document.write('假设这是很多重要的Javascript代码的执行结果');");
}
浏览器传递参数信息的细节
一..使用GET方式传递参数
1.在浏览器地址栏中输入某个URL地址或单击网页上的一个超链接时,浏览器发出的HTTP请求消息的请求方式为GET。
2.如果网页中的<form>表单元素的method属性被设置为了“GET”,浏览器提交这个FORM表单时生成的HTTP请求消息的请求方式也为GET。
3.使用GET请求方式给WEB服务器传递参数的格式:
http://www.it315.org/counter.jsp?name=zhangsan&password=123
4.使用GET方式传送的数据量一般限制在1KB以下。
留心 :不要使用GET方式提交包含口令的FORM表单
二..使用POST方式传递参数
1.POST请求方式主要用于向WEB服务器端程序提交FORM表单中的数据。
2.POST方式将各个表单字段元素及其数据作为HTTP消息的实体内容发送给WEB服务器,传送的数据量要比使用GET方式传送的数据量大得多。
3.<form>表单元素的enctype属性用于指定浏览器使用哪种编码方法将表单中的数据传送给WEB服务器,该属性可以有两种取值:
application/x-www-form-urlencoded
multipart/form-data
3 POST请求消息的格式:
POST /counter.jsp HTTP/1.1
referer: http://localhost:8080/Register.html
content-type: application/x-www-form-urlencoded
host: localhost:8080
content-length: 43
name=zhangsan&password=123
三..提交、重置、普通按钮如何传送参数
总结:
① 在一个FORM表单中可以有多个提交按钮,单击任何一个提交按钮都可以提交表单,只有被单击的提交按钮的名称和值才被作为参数传递,其它提交按钮的信息不会作为参数传递。
② 表单中的普通按钮与重置按钮的名称和值不会作为参数传递。
③ 没有设置name属性的表单字段元素的信息不会作为参数传递。
四..使用Javascript防止重复提交表单
<script>
var isCommitted = false;
function checkPost()
{
if(!isCommitted)
{
isCommitted = true;
return true;
}
else
{
alert("不能重复提交表单");
return false;
}
}
</script>
<form action="servlet/RepeateFormServlet" method="POST" οnsubmit="return checkPost()">...
五..单选列表框的处理经验
前台的网页代码:
<select name="subject">
<option value="">--不选--</potion>
<option value="0">java</option>
<option value="1">c++</option>
<option value="2">jsp</option>
</select>
服务器端的程序处理代码:
String subject = request.getParameter ("subject");
//如果没有选择或是选择了“—不选--”项
if(subject == null || "".equals(subject))
{
//这里是用户没有选择时的处理语句
}
else
{
//这里是用户进行了选择时的处理语句
}