Servlet客户端HTTP请求:
当用户通过浏览器请求网页时,会向Web服务器发送特定的信息,这些信息不能被直接读取,因为这些信息是作为HTTP请求的头的一部分进行传输的。
来自于浏览器端的重要的头信息:
头信息 | 信息的具体描述 |
Accept | 指定浏览器或其他客户端可以处理的MIME类型,值image/png或image/jpeg是最常见的两种可能值。 |
Accept-Charset | 指定浏览器可以用来显示信息的字符集,例如ISO-8859-1。 |
Accept-Encoding | 指定浏览器知道如何处理的编码类型,值gzip或compress是最常见的两种可能值。 |
Accept-Language | 指定客户端的首选语言,在这种情况下,Servlet会产生多种语言的结果,例如en,en-us,ru等等。 |
Authorization | 用户客户端在访问受密码保护的网页时识别自己的身份。 |
Connection | 指示客户端是否可以处理持久的HTTP连接,持久连接允许客户端或其他浏览器通过单个请求来检索多个文件,值Keep-Alive意味着使用了持续连接。 |
Content-Length | 只适合于POST请求,并给出POST数据的大小(以字节为单位)。 |
Cookie | 把之前发送到浏览器的cookies返回到服务器。 |
Host | 指定原始的URL中的主机和端口。 |
If-Modified-Since | 只有当页面在指定的日期后已更改时,客户端想要的页面。如果没有新的结果可以使用,服务器会发送一个304代码,表示NOt Modified头信息。 |
If-Unmodified-Since | 与If-Modified-Since对立,它指定只有当文档早于指定日期时,操作才会成功。 |
Referer | 指示所指向的Web页的URL,例如如果您再网页1,点击一个连接到网页2,当浏览器请求网页2时,网页1的URL就会包含在Referer头信息中。 |
User-Agent | 识别发出请求的浏览器或其他客户端,并可以向不同类型的浏览器返回不同的内容。 |
Servert提供的读取HTTP头的方法:
以下方法都可以通过HttpServletRequest对象进行调用。
方法 | 描述 |
Cookie[] getCookies() | 返回一个数组,包含客户端发送该请求的所有的Cookie对象。 |
Enumeration getAttributeNames() | 返回一个枚举,包含提供给该请求的可用的属性名称。 |
Enumeration getHeaderNames() | 返回一个枚举,包含在该请求中所包含的所有的头名。 |
Enumeration getParameterNames() | 返回一个String对象的枚举,包含在该请求中包含的参数的名称。 |
HttpSession getSession(boolean create) | 返回与该请求关联的当前session会话,如果请求没有session的话,则创建一个。 |
Locale getLocale() | 基于Accept-Language头,返回客户端接受内容的首选的区域设置。 |
Object getAttribute(String name) | 以对象的形式返回已命名的属性值,如果没有给定名称的属性值,返回null。 |
ServletInputStream getInputStream() | 使用ServletInputStream,以二进制数据形式检索请求的主体。 |
String getAuthType() | 返回用于保护Servlet的身份验证方案的名称,例如:“BASIC”或“SSL”,如果JSP没有受到保护则返回null。 |
String getCharacterEncoding() | 返回请求主体中使用的字符编码的名称。 |
String getContentType() | 返回请求主体的MIME类型,如果不知道返回类型则返回null。 |
String getContextPath() | 返回指示请求上下文的URI部分。 |
String getHeader(String name) | 以字符串形式返回指定的请求头的值。 |
String getMethod() | 返回请求的HTTP方法的名称,例如GET,POST或者PUT。 |
String getParameter(String name) | 以字符串形式返回请求参数的值,或者如果参数不存在则返回null。 |
String getPathInfo() | 当请求发出时,返回与客户端发送的URL相关的任何额外的路径信息。 |
String getProtocol() | 返回请求协议的名称和版本。 |
String getQueryString() | 返回包含在路径后的请求URL中的查询字符串。 |
String getRemoteAddr() | 返回发送请求的客户端的IP地址。 |
String getRemoteHost() | 返回发送请求的客户端的完全限定名称。 |
String getRemoteUser() | 如果用户已通过身份验证,则返回请求的登录用户,或者如果用户未通过身份验证,则返回null。 |
String getRequestURI() | 从协议名称知道HTTp请求的第一行的查询字符串中,返回该请求的URL的一部分。 |
String getRequestedSessionId() | 返回由客户端指定的session会话ID。 |
String getServletPath() | 返回调用JSP的请求的URL的一部分。 |
String[] getParamaterValues(String name) | 返回一个字符串对象的数组,包含所有给定的请求参数的值,如果参数不存在则返回null。 |
boolean isSecure | 返回一个布尔值,知识请求是否使用安全通道,如HTTPS。 |
int getContentLength() | 以字节为单位返回请求主体的长度,并提供输入流,或者如果长度未知则返回-1。 |
int getIntHeader(String name) | 返回指定的请求头的值为一个int值。 |
int getServletPort() | 返回接收到这个请求的端口号。 |
int getParameterMap() | 将参数封装成Map类型。 |
案例:
创建一个web工程,src目录下创建servletdemo包,包下创建servletDemo1类。
package servletdemo;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Locale;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.jasper.tagplugins.jstl.core.Out;
@WebServlet("/getContent")
//扩展HttpServlet类
public class ServletDemo1 extends HttpServlet{
//处理get方法的请求
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException {
//设置响应内容类型
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
String title = "Servlet的HTTP请求";
String htmlStr = new String("<!DOCTYPE html> \n");
htmlStr += "<html>\n";
htmlStr += "<head><meta charset=\"utf-8\"><title>" + title + "</title></head>\n";
htmlStr += "<body bgcolor=\"#f0f0f0\">\n";
htmlStr += "<h1 align=\"center\">" + title + "</h1>\n";
//客户端接受内容的首选的区域设置
Locale locale = request.getLocale();
//请求主体中使用的字符编码的名称
String encodeStr = request.getCharacterEncoding();
//请求主体的 MIME类型
String contentStr = request.getContentType();
//请求的 HTTP 方法的名称
String methodStr = request.getMethod();
//与客户端发送的 URL 相关的任何额外的路径信息
String pathInfoStr = request.getPathInfo();
//发送请求的客户端的互联网协议(IP)地址
String remoteAddrStr = request.getRemoteAddr();
//发送请求的客户端的完全限定名称
String remoteHostStr = request.getRemoteHost();
//调用 JSP 的请求的 URL的一部分
String servletPathStr = request.getServletPath();
//请求的 URL 的一部分
String requestURIStr = request.getRequestURI();
//接收到这个请求的端口号
int servletPortStr = request.getServerPort();
htmlStr += "<p>客户端接受内容的首选的区域设置:"+locale+"+<p>";
htmlStr += "<p>请求主体中使用的字符编码的名称:"+encodeStr+"</p>";
htmlStr += "<p>请求主体的 MIME类型:"+contentStr+"</p>";
htmlStr += "<p>请求的 HTTP 方法的名称:"+methodStr+"</p>";
htmlStr += "<p>与客户端发送的 URL 相关的任何额外的路径信息:"+pathInfoStr+"</p>";
htmlStr += "<p>发送请求的客户端的互联网协议(IP)地址:"+remoteAddrStr+"</p>";
htmlStr += "<p>发送请求的客户端的完全限定名称:"+remoteHostStr+"</p>";
htmlStr += "<p>调用 JSP 的请求的 URL的一部分:"+servletPathStr+"</p>";
htmlStr += "<p>请求的 URL 的一部分:"+requestURIStr+"</p>";
htmlStr += "<p>接收到这个请求的端口号:"+servletPortStr+"</p>";
htmlStr += "</body>";
htmlStr += "</html>";
out.println(htmlStr);
}
//处理POST请求的方法
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException {
doGet(request, response);
}
}
在web.xml中添加如下内容:
<servlet>
<!-- 类名 -->
<servlet-name>ServletDemo1</servlet-name>
<!-- 所在的包 -->
<servlet-class>servletdemo</servlet-class>
</servlet>
<servlet-mapping>
<!-- 类名 -->
<servlet-name>ServletDemo1</servlet-name>
<!-- 访问路径 -->
<url-pattern>/servletdemo/getContent</url-pattern>
</servlet-mapping>
访问结果: