简介
WEB客户端发送给WEB服务器的HTTP请求消息分为三个部分:
请求行 POST /demo/login HTTP/1.1
请求消息头
消息正文(也叫实体内容) username=xxxx&password=1234
Servlet API中定义的ServletRequest接口类用于封装请求消息。
HttpServletRequest是专用于HTTP协议的ServletRequest子接口,它用于封装HTTP请求消息。
在service()方法内部调用HttpServletRequest对象的各种方法来获取请求消息
获取请求头信息
getHeader方法
getHeaders方法
getHeaderNames方法
getIntHeader方法
getDateHeader方法
getContentType方法
getContentLength方法
getCharacterEncoding方法
例:
EnumerationheaderNames = 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>");
}*/
}
利用Referer请求头阻止“盗链”
例:
Stringreferrer = request.getHeader("referer");
StringsitePart = "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源码
例:
Stringreferrer = request.getHeader("referer");
StringsitePart = "http://" + request.getServerName();
if(referrer!=null&& referrer.startsWith(sitePart))
{
//向客户端输出javascript的document.write(...)语句
out.println(
"document.write('假设这是很多重要的Javascript代码的执行结果');");
}
客户端身份认证实践
StringencodedAuth = request.getHeader("Authorization");
//要求客户端发送身份认证信息,并且只能是BASIC认证方式中
if(encodedAuth == null ||!encodedAuth.toUpperCase().startsWith("BASIC"))
{
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
response.setHeader("WWW-Authenticate","BASICrealm=\"it315\"");
//当用户单击登录框中的“取消”按钮时,将输出下面的内容
out.println("没有传递用户身份!");
return ;
}
使用Javascript防止重复提交表单
<script>
varisCommitted = false;
functioncheckPost()
{
if(!isCommitted)
{
isCommitted = true;
return true;
}
else
{
alert("不能重复提交表单");
return false;
}
}
</script>
<formaction="servlet/RepeateFormServlet" method="POST"onsubmit="return checkPost()">...
分析文件上传的请求消息结构
ServletInputStreamsis = request.getInputStream();
StringfilePath = getServletContext().getRealPath("/body.out");
FileOutputStreamfos = new FileOutputStream(filePath);
byte[]buf = new byte[1024];
intlen = sis.read(buf,0,1024);
while(len!= -1)
{
fos.write(buf,0,len);
len = sis.read(buf,0,1024);
}
fos.close();
sis.close();
了解中文字符的URL编码
publicstatic String encode(String s,String enc)
throwsUnsupportedEncodingException
publicstatic String decode(String s,String enc)
throwsUnsupportedEncodingException