request是Servlet.service()方法的一个参数,类型为javax.servlet.http.HttpServletRequest。在客户端发出每个请求时,服务器都会创建一个request对象,并把请求数据封装到request中,然后在调用Servlet.service()方法时传递给service()方法,这说明在service()方法中可以通过request对象来获取请求数据。
请求行
请求头
空行
请求体(get没有请求体)
一、获取常用信息:
相关方法:
获取客户端IP,request.getRemoteAddr()
例如平常所见的封号就是封IP
请求方式,request.getMethod(),可能是POST也可能是GET
二、获取请求头:
相关方法:
- String getHeader(String name),用于单值头
- int getIntHeader(String Name),用于单值int类型的请求头
- long getDateHeader(String name),用于单值毫秒类型的请求头
- Enumeration getHeader(String name),适用于多值请求头
案例:
通过User-Agent识别用户浏览器类型
String addr = request.getRemoteAddr();//获取客户端IP地址 System.out.println("IP: "+ addr); System.out.println("请求方式: " + request.getMethod());//获取请求方式 String userAgent = request.getHeader("User-Agent");//获取名为User-Agent的请求头 System.out.println(userAgent);
使用Referer请求头防盗链
Referer请求头会存储请求来源的地址
String referer = request.getHeader("Referer"); System.out.println(referer);//输出请求来源的地址 //如果请求是从浏览器地址行输入的地址(referer值会为null)或者请求地址中没有"localhost" if(referer == null || !referer.contains("localhost")){ response.sendRedirect("http://www.baidu.com"); }else{ System.out.println("hello!"); }
三、获取请求URL:
相关方法:
- String getScheme():返回请求协议,例如:http
- String getServerName():返回主机名,例如:localhost
- int getServerPort():返回服务器端口号,例如:8080
- String getContextPath():返回上下文路径,例如:/hello
- String getQueryString():返回请求URL中的参数,例如:name=zhangSan
- String getRequestURI():返回请求URI路径,例如:/hello/oneServlet
- String getRequestURI():返回URL路径,等于不包含项目参数的整个请求路径。
- String getServletPath():返回Servlet路径,例如:/oneServlet
四、获取请求参数:
1. 常见的客户端传递参数方式:
- 浏览器地址栏直接输入:一定是GET请求;
- 超链接:一定是GET请求;
- 表单:可以是GET,也可以是POST,这取决与的method属性值;
看看FServlet.java这个Demo!!!
2. GET请求和POST请求的区别:
GET请求
请求参数会在浏览器的地址栏中显示,所以不安全;
请求参数长度限制长度在1K之内;
GET请求没有请求体,无法通过request.setCharacterEncoding()来设置参数的编码;
POST请求
请求参数不会显示浏览器的地址栏,相对安全;
请求参数长度没有限制;
3. 相关方法:
- (常用)String getParameter(String name):通过指定名称获取参数值;
- String[] getParameterValues(String name):当多个参数名称相同时,可以使用方法来获取;
- Enumeration getParameterNames():获取所有参数的名字;
- (常用)Map getParameterMap():获取所有参数封装到Map中,其中key为参数名,value为参数值,因为一个参数名称可能有多个值,所以参数值是String[],而不是String
五、请求转发和请求包含
无论是请求转发还是请求包含,都表示由多个Servlet共同来处理一个请求。例如Servlet1来处理请求,然后Servlet1又转发给Servlet2来继续处理这个请求。
//使用request获取RewuestDispatcher对象(调度器),方法的参数是被转发或被包含的servlet的servlet路径即MyServlet的<url-pattern>值
RewuestDispatcher rd = request.getRewuestDispatcher("/MyServlet");
1. 请求转发:
rd.forward(request,response);
调用“调度器”的转发方法,该方法等同与告诉服务器,去调用MyServlet的service()方法一样。
System.out.println("AServlet");
RequestDispatcher rd = request.getRequestDispatcher("/MyServlet");
rd.forward(request, response);
—>
System.out.println("MyServlet");
2. 请求包含:
rd.include(request,response);
在AServlet中,把请求包含到MyServlet。
System.out.println("AServlet");
RequestDispatcher rd = request.getRequestDispatcher("/MyServlet");
rd.include(request, response);
—>
System.out.println("BServlet");
3. 比较:
- 如果在AServlet中请求转发到MyServlet,那么在AServlet中就不允许再输出响应体 ,即不能再使用response.getWriter()和response.getOutputStream()向客户端输出,这一工作应该由BServlet来完成;如果是使用请求包含,那么没有这个限制;
- 请求转发虽然不能输出响应体,但还是可以设置响应头的,例如:response.setContentType(”text/html;charset=utf-8”);
- 请求包含大多是应用在JSP页面中,完成多页面的合并;
- 请求转发大多是应用在Servlet中,转发目标大多是JSP页面;
六、请求转发和重定向:
- 请求转发是一个请求,而重定向是两个请求;
- 请求转发后浏览器地址栏不会有变化,而重定向会有变化,因为重定向是两个请求;
- 请求转发的目标只能是本应用中的资源,重定向的目标可以是其他应用;
- 请求转发对AServlet和BServlet的请求方法是相同的,即要么都是GET,要么都是POST,因为请求转发是一个请求;
- 重定向的第二个请求一定是GET;、
七、request域:
1. Servlet中的三大域对象:
- request
- session
- application
2.方法(Servlet中的三大域对象都有这些方法,只是范围不同):
- void setAttribute(String name , Object value)
- Object getAttribute(String name)
- void removeAttribute(String name)