6.HttpServletRequest对象

1.获取请求行消息的方法

当访问Servlet时,会在请求消息的请求行中,包含请求方法、请求资源名,请求路径等信息,为了获取这些信息,在HttpServletRequest接口中,定义了一系列用于获取请求行信息的方法,如下表所示
6.HttpServletRequest对象
6.HttpServletRequest对象

response.setContentType("text/html;charset=utf-8");
 PrintWriter out = response.getWriter();
 out.println("getRequestURL : " + request.getRequestURL() + "<br>");
 out.println("getScheme : " + request.getScheme() + "<br>");
 out.println("getServerName : " + request.getServerName() + "<br>");
 out.println("getServerPort : " + request.getServerPort() + "<br>");
 out.println("getContextPath : " + request.getContextPath() + "<br>");
 out.println("getServletPath : " + request.getServletPath() + "<br>");
 out.println("getRequestURI : " + request.getRequestURI()+ "<br>");
 out.println("getQueryString : " + request.getQueryString()+ "<br>");    
 out.println("getRemoteAddr : " + request.getRemoteAddr() + "<br>");
 out.println("getRemoteHost : " + request.getRemoteHost() + "<br>");
 out.println("getRemotePort : " + request.getRemotePort() + "<br>");
 out.println("getLocalAddr : " + request.getLocalAddr() + "<br>");
 out.println("getLocalName : " + request.getLocalName() + "<br>");
 out.println("getLocalPort : " + request.getLocalPort() + "<br>"); 

getRequestURL : http://localhost:8080/s6
运行结果:
getScheme : http

getServerName : localhost

getServerPort : 8080

getContextPath :

getServletPath : /s6

getRequestURI : /s6

getQueryString : null

getRemoteAddr : 0:0:0:0:0:0:0:1

getRemoteHost : 0:0:0:0:0:0:0:1

getRemotePort : 22504

getLocalAddr : 0:0:0:0:0:0:0:1

getLocalName : 0:0:0:0:0:0:0:1

getLocalPort : 8080

注意:getLocalPort 与getServerPort 的区别
如果tomcat服务器端口是80,对外端口是通过防火墙设置后映射出来的,为8050,
用getLocalhost获取到的是80端口,
用getServerPort获取到的是8050端口。

2.获取请求消息头

请求消息头用于向服务器传递附加信息,为了获取这些信息, HttpServletRequest接口定义了一系列用于获取请求消息头的方法
代码:

response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
 Enumeration headerNames =request.getHeaderNames();// 获取请求消息中所有头字段
    // 使用循环遍历所有请求头,并通过getHeader()方法获取一个指定名称的头字段
 while(headerNames.hasMoreElements()) {
    String headerName = (String)headerNames.nextElement();
    out.print(headerName + " : " + request.getHeader(headerName)+ "<br>");
 }

结果:

host : localhost:8080
user-agent : Mozilla/5.0 (Windows NT 10.0; WOW64; rv:40.0) Gecko/20100101Firefox/40.0
accept : text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
accept-language : zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
accept-encoding : gzip, deflate
connection : keep-alive

3.防盗链

原理:在下载服务器上,来判断一下上一步提交的网址(来源)是不是我要求的,如果是我要求的,那么可以下载,如果不是,不让下载。
sitePath:http://127.0.0.1
Path:http://127.0.0.1:8080/JavaTeachR/index.jsp
HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理。

Download.html

<html>
         <head>
                   <title>Insert titlehere</title>
         </head>
         <body>
                   <a href="/chapter05/DownManagerServlet">download</a>
         </body>
</html>

对链接进行处理

response.setContentType("text/html;charset=utf-8");
PrintWriter out =response.getWriter();
String referer =request.getHeader("referer");// 获取referer头的值
String sitePart = "http://"+ request.getServerName();// 获取访问地址
// 判断referer头是否为空,这个头的首地址是否以sitePart开始的
if (referer != null&& referer.startsWith(sitePart)) {
         // 处理正在下载的请求
         out.println("dealingdownload ...");
} else {
//  out.print("您没有权限下载,3秒后跳转到主页进行下载");
response.setHeader("Refresh","3;URL=http://localhost:8080/Download.html");
// 非法下载请求跳转到download.html页面

  RequestDispatcher rd= request.getRequestDispatcher("/download.html");

  rd.forward(request,response);

}

4.获取请求参数

form.html

<form action="/JavaTeach/servlet01"method="POST">

    用户名:<input type="text"name="username"><br>

    密码:<input type="password" name="password"><br>

    爱好

    <input type="checkbox"name="hobby" value="sing">唱歌

    <input type="checkbox"name="hobby" value="dance">跳舞

    <input type="checkbox"name="hobby" value="football">足球<br>

    <input type="submit"value="提交">

</form> 

servlet01

response.setContentType("text/html;charset=utf-8");    
PrintWriter out = response.getWriter();
String name = request.getParameter("username");
String password = request.getParameter("password");
out.println("用户名:" + name);
out.println("密   码:" + password);
String[] hobbys=request.getParameterValues("hobby");
out.print("爱好:");
for (int i = 0; i < hobbys.length; i++) {
   out.print(hobbys[i]+" ");
}

结果出现乱码
原因:浏览器在传递请求参数时,请求编码默认采用的是ISO8859-1 ,但在解码时采用的是utf-8编码,所以乱码。
解决:给请求对象设置编码:request.setCharacterEncoding(“utf-8”)