request对象

request对象

Request 的全称是 HttpServletRequest,
代表客户端的请求,当客户端通过 HTTP 协议访问服务器时,
HTTP 请求中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,
可以获得客户这些信息。

Request 对象常用操作:

1. 可以获取所有客户端去请求数据

2. 可以进行页面跳转—请求转发
//页面跳转,跳转到DemoServlet,urlPatterns = "/demo"
//request.getRequestDispatcher(url);
//url 就是页面跳转地址,以“/”开始,该代码是在服务器中执行,就代表当前项目名称为根目录下
//request.getRequestDispatcher("demo").forward(request, response);

request.getRequestDispatcher("/demo").forward(request, response);

3. 可以获取当前应用程序名称
request.getContextPath()

4. request是一个域对象

域对象
可以在不同Servlet之间传递数据的对象,就是域对象

只要是域对象都有如下方法
    setAttribute(name,value);存储数据的方法
    getAttribute(name);根据name获取对应数据值
    removeAttribute(name);删除数据

Request 获取请求行信息

HTTPhttp 协议中请求行的内容分为:

请求方式、请求路径、协议版本。
String getMethod() 获取请求方式的类型

String getRequestURI() 获取客户端发送请求行中资源名称部分

StringBuffer getRequestURL() 获取客户端发送请求完整URL

//uri是统一资源标识符,用来标识一个资源路径。
//url是统一资源定位符,是一种具体的uri,
//可以用来标识一个资源,并且指明了如何定位一个资源。


String getProtocol()  获取当前协议的名称和版本

String getRemoteAddr() 获取IP地址

int getLocalPort() 获取端口号
protected void doGet(HttpServletRequest request,
 HttpServletResponse response) throws ServletException, IOException {

    //获取请求方式
    String method = request.getMethod();

    //获取请求的 URL,请求的完整路径
    String url = request.getRequestURL().toString();

    //获取请求的 URI,请求资源,
    String uri = request.getRequestURI();

    //获取请求的协议和版本
    String protocol = request.getProtocol();

    //获取客户端的 IP 地址
    String clientIP = request.getRemoteAddr();

    //获取服务器的端口号
    int serverPort = request.getLocalPort();

    System.out.println(method);
    System.out.println(url);
    System.out.println(uri);
    System.out.println(protocol);
    System.out.println(clientIP);
    System.out.println(serverPort);
}

Request 获取请求头信息

String getHeader(String name) 以String的形式返回指定请求头中某一头名称的值
//request.getHeader("Referer") 获取 Referer 请求头

Enumeration getHeaderName() 返回此请求包含的所有头名称的枚举

Host 服务器的域名
Origin 服务器名称
User‐Agent 当前系统和浏览器版本
Referer 本次请求来源路径
protected void doPost(HttpServletRequest request, 
HttpServletResponse response) throws ServletException, IOException {
    //获取 referer 请求头,表示本次请求,来源于什么地址
    String referer = request.getHeader("Referer");

    if(referer!=null) {

       System.out.println(referer);

    }else{
       System.out.println("你是直接访问 DemoServlet 的");
    }

}
protected void doGet(HttpServletRequest request, 
HttpServletResponse response) throws ServletException, IOException {
    //调用 doPost
    this.doPost(request,response);
}

使用 referer 实现防盗链

两次请求同一个域名,显示可以下载
两次请求同不同域名,显示无法下载
1. 创建一个 download.html 和 DownloadServlet。
2. 在 DownloadServlet 中使用 request 对象的 getHeader 方法获取 referer 请求头信息。
3. 通过 referer 判断请求的来源地址,判断是否与当前项目统一。
4. 如果与当前项目统一就显示可以下载,否则显示不可以下载,因为是盗链的。

download.html

...
<body>
    <a href="http://127.0.0.1:8080/demo/DownloadServlet">下载</a>
</body>
...

DownloadServlet

...
@WebServlet(name = "DownloadServlet",urlPatterns = "/DownloadServlet")
public class DownloadServlet extends HttpServlet {

    protected void doPost(HttpServletRequest request, 
    HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, 
    HttpServletResponse response) throws ServletException, IOException {

        //获取请求头中的 referer
        String referer = request.getHeader("referer");

        System.out.println("referer=" + referer);
        String str="http://127.0.0.1:8080/demo/download.html";

        //如果非空且来源合法
        if(referer != null &&str.equals(referer)){

            System.out.println("请求合法,允许下载。。。");
        }else{

            System.out.println("请求不合法,不允许下载。。。");
        }
    }
}

获取用户当前使用的浏览器版本

1. 创建 UserAgentServlet
2. 调用 request 的 getHeader 方法,获取消息头 User-Agent
3. 打印在控制台上
...
@WebServlet(name = "UserAgentServlet",urlPatterns = "/UserAgentServlet")

    public class UserAgentServlet extends HttpServlet {
HttpServletResponse response) throws ServletException, IOException {

        this.doGet(request,response);

    }

    protected void doGet(HttpServletRequest request, 
    HttpServletResponse response) throws ServletException, IOException {

        //获取请求头--user-agent
        String userAgent = request.getHeader("user-agent");

        System.out.println(userAgent);
    }
}

Request 对象请求体信息

请求体的数据是客户端post提交请求的参数数据
String getParameter(String name)
返回指定名称的一个参数数据值

String[] getParameterValues(String name)

返回指定名称的一组参数数据值
//用户名
String username = request.getParameter("username");
//密码
String pwd = request.getParameter("password");
//爱好
String[] hobbies = request.getParameterValues("hobby");

OutputStream outputStream = response.getOutputStream();

outputStream.write(("<p>username:"+username+"</p>").getBytes());

outputStream.write(("<p>password:"+pwd+"</p>").getBytes());

outputStream.write(("<p>hobby:"+ Arrays.toString(hobbies)+"</p>").getBytes());

页面跳转—请求转发

RequestDispatcher getRequestDispatcher(String path) 获取请求转发器  (request对象方法)

void forward(ServletReqeust request,ServletResponse response)
    将请求转发到另外一个资源(servlet)上   (RequestDispatcher对象方法)
//页面跳转,跳转到Demo2Servlet
//request.getRequestDispatcher(url);获取请求转发器
//url 就是页面跳转地址,以“/”开始,就代表当前项目名称为根目录
request.getRequestDispatcher("/demo2").forward(request, response);

获取当前工程名字

//输出当前共工程的名字
System.out.println("当前工程名字:"+request.getContextPath());

request是一个域对象

域对象
    可以在不同Servlet之间传递数据的对象,就是域对象
只要是域对象都有如下方法
    setAttribute(name,value);存储数据的方法
    getAttribute(name);根据name获取对应数据值
    removeAttribute(name);删除数据
//定义数据
List<String> list = new ArrayList<String>();

list.add("张三");
list.add("李四");
list.add("王五");

//使用域对象request存储数据
request.setAttribute("emplist", list);

//页面跳转
request.getRequestDispatcher("/requestGetData").forward(request, response);
//从域对象里面获取数据
Object object = request.getAttribute("emplist");

if(object!=null){
    List<String> list = (List<String>) object;
    for (int i = 0; i < list.size(); i++) {

        System.out.println(list.get(i));
    }
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值