1、概述:

我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表的响应response。

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

service方法中的request的类型是ServletRequest,而doGet/doPost方法的request的类型是HttpServletRequest,HttpServletRequest是ServletRequest的子接口,功能和方法更加强大,今天我们学习HttpServletRequest。

2、request的运行流程

HttpServletRequest 随笔 第1张

 

3、通过抓包工具抓取Http请求

HttpServletRequest 随笔 第2张

因为request代表请求,所以我们可以通过该对象分别获得Http请求的请求行,请求头和请求体

4、通过request获得请求行

获得客户端的请求方式:String getMethod()

获得请求的资源:

String getRequestURI()  获得请求地址

StringBuffer getRequestURL()       获得网络地址

String getContextPath() ---获得web应用的名称

String getQueryString() ----只能获得 get方式提交url地址后的参数字符串 如:username=zhangsan&password=123

注意:request获得客户机(客户端)的一些信息

request.getRemoteAddr() --- 获得访问的客户端IP地址

5、通过request获得请求头

long getDateHeader(String name)

String getHeader(String name)

Enumeration getHeaderNames()

Enumeration getHeaders(String name)

int getIntHeader(String name)

referer头的作用:执行该此访问的的来源,做防盗链 (referer的内容为访问的网络地址)

 

HttpServletRequest 随笔 第3张
package com.oracle.demo01;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class RefererServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取referer请求头
        String referer=request.getHeader("referer");
        //对该访问的来源进行判断
            //如果判断成功,代表我自己的域名,就可以访问
        if(referer!=null&&referer.startsWith("http://localhost:8080")){
            response.setContentType("text/html;charset=utf-8");
            response.getWriter().write("习大大擘画新时代党的组织路线图");
        }else{
            response.setContentType("text/html;charset=utf-8");
            response.getWriter().write("你是盗链者,丢不丢人");
        }
    }
    

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}
HttpServletRequest 随笔 第4张

 

Jsp代码:

HttpServletRequest 随笔 第5张
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <a href="/WEB04/RefererServlet">习大大说新时代</a>
    <form action="/WEB04/LoginServlet" method="get">
        用户名:<input type="text" name="username"><br>
        密码:<input type="password" name="pwd"><br>
        <input type="submit" value="登陆"><br>
        <input type="reset" value="重置">
    </form>
</body>
</html>
HttpServletRequest 随笔 第6张

 

代码演示:

HttpServletRequest 随笔 第7张
package com.oracle.demo01;

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取请求行里信息的方法    
        //获取请求方式
        String method=request.getMethod();
        System.out.println(method);
        //获取请求资源的相关内容
        String requestURI=request.getRequestURI();
        StringBuffer requestURL=request.getRequestURL();
        System.out.println("requestURI:"+requestURI);
        System.out.println("requestURL:"+requestURL);
        //获取WEB应用的名称
        String name=request.getContextPath();
        System.out.println(name);
        //获取get方式提交后url地址后的字符串
        String queryString=request.getQueryString();
        System.out.println(queryString);
        //获取客户机的信息----获取访问者的IP地址
        String ip=request.getRemoteAddr();
        System.out.println(ip);
//获取请求头中的内容
        //获取指定头
        String header=request.getHeader("User-Agent");
        System.out.println(header);
        //获得所有头的名称
        Enumeration<String> en=request.getHeaderNames();   //以键值对的形式获得,并保存在集合中
        while(en.hasMoreElements()){   //遍历,获得键和值
            String headerName=en.nextElement();
            String headerValue=request.getHeader(headerName);
            System.out.println(headerName+":"+headerValue);
        }
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}
HttpServletRequest 随笔 第8张

6、通过request获取请求体

String getParameter(String name)

String[] getParameterValues(String name)

Enumeration getParameterNames()

Map<String,String[]> getParameterMap()

      注意:get请求方式的请求参数 上述的方法一样可以获得

      解决post提交方式的乱码:request.setCharacterEncoding("UTF-8");

      解决get提交的方式的乱码: parameter = new String(parameter.getbytes("iso8859-1"),"utf-8");

7、request的其他功能

(1)request是一个域对象

request对象也是一个存储数据的区域对象,所以也具有如下方法:

setAttribute(String name, Object o)

getAttribute(String name)

removeAttribute(String name)

注意:request域的作用范围:一次请求中

(2)request完成请求转发

获得请求转发器----path是转发的地址

RequestDispatcher getRequestDispatcher(String path)

通过转发器对象转发

requestDispathcer.forward(ServletRequest request, ServletResponse response)

注意:ServletContext域与Request域的生命周期比较?

    ServletContext

      创建:服务器启动

      销毁:服务器关闭

      域的作用范围:整个web应用

    request

      创建:访问时创建request

      销毁:响应结束request销毁

      域的作用范围:一次请求中

注意:转发与重定向的区别?

      1)重定向两次请求,转发一次请求

      2)重定向地址栏的地址变化,转发地址不变

      3)重新定向可以访问外部网站 转发只能访问内部资源

      4)转发的性能要优于重定向 

代码演示:  

 

HttpServletRequest 随笔 第9张
package com.oracle.demo02;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Servlet01 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //向request域中存值
        request.setAttribute("name", "wang");
        //请求转发
        //获得转发器对象,并调用转发方法
        request.getRequestDispatcher("/Servlet02").forward(request, response);
        
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}
HttpServletRequest 随笔 第10张

 

 

  

总结:

request获得行的内容

       request.getMethod()

       request.getRequestURI()

       request.getRequestURL()

       request.getContextPath()

       request.getRemoteAddr()

request获得头的内容

       request.getHeader(name)

request获得体(请求参数)

       String request.getParameter(name)

       Map<String,String[]> request.getParameterMap();

       String[] request.getParameterValues(name);

       注意:客户端发送的参数 到服务器端都是字符串 

获得中文乱码的解决:

       post:request.setCharacterEncoding(“UTF-8”);

       get:parameter = new String(parameter.getBytes(“iso8859-1”),”UTF-8”); 

request转发和域

       request.getRequestDispatcher(转发的地址).forward(req,resp);

       request.setAttribute(name,value)

       request.getAttribute(name)

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄