Servlet (三)——(HttpServlet)Request

​ 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)
    这里写图片描述

猜你喜欢

转载自blog.csdn.net/ts_forever/article/details/80054615