1.获取请求行消息的方法
当访问Servlet时,会在请求消息的请求行中,包含请求方法、请求资源名,请求路径等信息,为了获取这些信息,在HttpServletRequest接口中,定义了一系列用于获取请求行信息的方法,如下表所示
response.setContentType("text/html;charset=utf-8");PrintWriter out = response.getWriter();out.println("getRequestURL : " + request.getRequestURL() + "
");out.println("getScheme : " + request.getScheme() + "
");out.println("getServerName : " + request.getServerName() + "
");out.println("getServerPort : " + request.getServerPort() + "
");out.println("getContextPath : " + request.getContextPath() + "
");out.println("getServletPath : " + request.getServletPath() + "
");out.println("getRequestURI : " + request.getRequestURI()+ "
");out.println("getQueryString : " + request.getQueryString()+ "
"); out.println("getRemoteAddr : " + request.getRemoteAddr() + "
");out.println("getRemoteHost : " + request.getRemoteHost() + "
");out.println("getRemotePort : " + request.getRemotePort() + "
");out.println("getLocalAddr : " + request.getLocalAddr() + "
");out.println("getLocalName : " + request.getLocalName() + "
");out.println("getLocalPort : " + request.getLocalPort() + "
");
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)+ "
");}
结果:
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
download
对链接进行处理
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
用户名:
密码:
爱好唱歌跳舞足球
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 }
结果出现乱码
原因:浏览器在传递请求参数时,请求编码默认采用的是ISO8859-1 ,但在解码时采用的是utf-8编码,所以乱码。
解决:给请求对象设置编码:request.setCharacterEncoding(“utf-8”)