l使用GET方式向服务器请求资源
浏览器向服务器发送的信息:
GET /?username=213&psw=321HTTP/1.1 //请求行
Accept: */* //以下都是请求头
Accept-Language: zh-cn
User-Agent: Mozilla/4.0
Accept-Encoding: gzip, deflate
Host: 127.0.0.1:8888
Connection: Keep-Alive //请求头
//一个空行
l使用POST方式向服务器请求资源
POST / HTTP/1.1 //请求行
Accept: */* //以下都是请求头
Accept-Language: zh-cn
User-Agent: Mozilla/4.0
Accept-Encoding: gzip, deflate
Host: 127.0.0.1:8888
Content-Length: 53
Connection: Keep-Alive
Cache-Control: no-cache //请求头
//一个空行
username=11111&psw=222 //实体内容
以上信息为使用HTML表单<form action="127.0.0.1:8888" method="GET和POST">和以下代码共同使用打印:
public class StaticWebServer {
public static void main(String[] args) {
int port = 8888;
try {
// 开启服务器,等待客户端的链接
ServerSocket ss = new ServerSocket(port);
System.out.println("服务器已经启动,正在监听" + port + "端口...");
// 不断地接收客户端的请求
while (true) {
final Socket socket = ss.accept();
// 用多线程可以处理多个客户端的请求a
new Thread() {
public void run() {
try {
// 接收客户端发送过来的信息
InputStream in2 = socket.getInputStream();
for (int b = -1; (b = in2.read()) != -1;) {
System.out.print((char) b);
}
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
l区别:GET vs POST
1、GET方式
1)可以在请求的URL地址后以?的形式带上交给服务器的数据,多个数据之间以&进行分隔(其数据容量不能超过1K。),例如:
GET/mail/1.html?name=abc&password=xyz HTTP/1.1
2)提交加密敏感信息是最后不要用GET方法
3)GET可以使用缓存
2、POST方式
1)POST方式提交的参数会放在实体内容里面,多个参数之间以&分割, 传送的数据量无限制。
2)适合提交加密敏感信息
3)POST不能使用缓存
l用于HTTP请求中的常用头
Accept: text/html,image/* 客户端支持的数据类型
Accept-Charset: ISO-8859-1 客户端支持的编码
Accept-Encoding: gzip,compress 客户端的数据压缩格式
Accept-Language: en-us,zh-cn 客户端支持的语言
Host: www.it315.org:80 客户端访问的主机地址
If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT 客户端缓存的时间
Referer: http://www.it315.org/index.jsp 从哪个资源访问服务器(防盗链)
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; WindowsNT 5.0) 客户端软件环境(浏览器类型,版本)
Cookie:
Connection: close/Keep-Alive 是否维持连接
Date: Tue, 11 Jul 2000 18:23:51 GMT 发送请求的时间
l处理Request:
常用的两种doGet和doPost,所以只需要在子类overriding doGet()和doPost();
Servlet程序会自动使用service方法接收standardHTTP requests,然后调用doXXX methods
package cn.itcast.request;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class TestRequest
*/
public class TestRequest extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// request.setCharacterEncoding("utf-8");//在这里无效,其只对实体编码有效
System.out.println("TestRequest.doGet()");
/****************** 获取 请求行 信息 ***********************************/
// 获取信息的方法详见 API--> HttpServletRequest
System.out.println(request.getMethod());// 输出: GET
System.out.println(request.getQueryString());//
// 输出:username=1111&password=222222
/****************** 获取 URI 信息 ***********************************/
System.out.println(request.getRequestURI());
// 输出:day10httpRequest/TestRequest.do
/****************** 获取 请求头 信息 ***********************************/
System.out.println(request.getHeader("Host"));// 输出: localhost:8080
/****************** 遍历 请求头 信息 ***********************************/
Enumeration<String> enums = request.getHeaderNames();
while (enums.hasMoreElements()) {
String headerName = enums.nextElement();
String headerValue = request.getHeader(headerName);
System.out.println("参数:" + headerName + ":" + headerValue);
}
/************ 【案例一:查看用户浏览器的类型】 ***************************/
String userAgent = request.getHeader("User-Agent");
System.out.println("浏览器类型:" + userAgent);
/*
* 输出:浏览器类型:Mozilla/5.0 (Windows NT 6.1; WOW64)
*/
if (userAgent.contains("Firefox")) {
System.out.println("这是火狐浏览器");
} else if (userAgent.contains("Chrome")) {
System.out.println("这是谷歌浏览器");
} else if (userAgent.contains("Trident")) {
System.out.println("这是IE浏览器");
} else {
System.out.println("这是不认识的浏览器");
}
/***************** 【案例二:防盗链】 **************************/
response.setContentType("text/html;charset=utf-8");
String referer = request.getHeader("Referer");
if (referer != null && (referer.contains("localhost"))) {
response.getWriter().write("<html><body>这是我的网站正确内容</body></html>");
} else {
response.getWriter().write(
"<html><body>小子,你盗用我网站的东西,赶紧去自首!</body></html>");
}
/*************** 根据参数的名称获取参数的值 ************************/
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println("统一方式1:" + username + ":" + password);
// 输出:统一方式1:111111111:22222222222
/************** 遍历所有的参数名 并且获得参数值 *********************/
Enumeration<String> enums2 = request.getParameterNames();
while (enums2.hasMoreElements()) {
String paramName = enums2.nextElement();
String paramValue = new String(request.getParameter(paramName)
.getBytes("iso8859-1"), "utf-8");
System.out.println("统一方式2" + paramName + ":" + paramValue);
}
/************************* 编码问题 ******************************/
// tomcat默认会把所有URL的内容都按照ISO8859-1来编码
// String paramValue = request.getParameter(paramName);这样出来的是 乱码
/*
* 解决编码问题第二种方式: 修改tomcat/conf/server.xml
*
* <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"
* redirectPort="8443" URIEncoding="utf-8"/>
*
* 在这里追加 URIEncoding="utf-8",作用是修改tomcat对URL内容的编码格式
*/
}
@Override
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
System.out.println("TestRequest.doPost()");
/****************** 编码问题 ****************************/
request.setCharacterEncoding("utf-8");
// 1、这个修改编码的方法一定要在所有获取参数的方法前面
// 2、这个编码要和页面上的<meta charset="UTF-8">编码保持一致
// 3、这个方法只能设置实体内容的编码,所以对Post方法提交的参数编码问题是有效的,但是对Get方法提交的参数无效!
/**************** 根据参数的名称获取参数的值 ********************/
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println("统一方式1:" + username + ":" + password);
/************* 遍历所有的参数名 并且获得参数值 *****************/
Enumeration<String> enums2 = request.getParameterNames();
while (enums2.hasMoreElements()) {
String paramName = enums2.nextElement();
String paramValue = request.getParameter(paramName);
System.out.println("统一方式2" + paramName + ":" + paramValue);
}
}
}