3、HttpServlet的Request对象、获得请求头、请求行、请求体、post乱码

1 HttpServlet概述

Servlet: 动态页面, 接收请求, 返回响应

  接口: Servlet: init service destroy
  类: HttpServlet  doGet doPost

  生命周期: 默认第一次访问创建, 服务器关闭销毁
           load-on-startup: 服务器开启时启动

init中的ServletConfig对象: getServletName() getInitParameter()
getServletContext()
ServletContext对象: getContextPath() getInitParameter()
getRealPath() 域对象
域对象: ServletContext范围 - 服务器运行期间
getAttribute() setAttribute() removeAttribute()

  url-pattern的配置: /path     /xx/*    *.do
                    / -> DefaultServlet

== request: 请求行[方式 URI 协议版本] 请求头[map] 请求体[post参数]
response:响应行[状态码] 响应头[map] 响应体[内容] ==

2 request的运⾏流程

在这里插入图片描述

3 抓取Http请求

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

在这里插入图片描述

4 通过request获得请求⾏

request:是客户端 -> 服务器(Servlet)  都是get方法
URL: 协议 + ip + port + uri
URI: 统一资源路径 从 / 开始

如果要跨服务器访问, 必须使用URL

步骤:
1.创建一个类extends Httpservlet
2.重写doget和dopost方法

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

获得请求的资源:
String getRequestURI() -- 获取请求URI
StringBuffer getRequestURL()

String getContextPath() -- 获取虚拟⽬录
String getServletPath() -- 获取Servlet路径

String getQueryString() -- 获取get⽅式请求参数
username=zhangsan&password=123

String getRemoteAddr() -- 获取客户机的IP地址
package a_request;

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 java.io.IOException;

@WebServlet("/Demo01Servlet")
public class Demo01Servlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 1.获得请求行信息
        // 请求方式 有get和post
        String method = req.getMethod(); // 大写
        System.out.println(method);

        // URI
        String uri = req.getRequestURI();
        System.out.println(uri);
        String url = req.getRequestURL().toString();
        System.out.println(url);

        // 获得客户端IP地址
        String addr = req.getRemoteAddr();
        System.out.println(addr);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

5 通过request获得请求头

long getDateHeader(String name)

String getHeader(String name)
int getIntHeader(String name)
Enumeration<String> getHeaderNames() -- 获取所有的请求头名称

常⻅的请求头:

1. User-Agent:浏览器告诉服务器,我访问你使⽤的浏览器版本信息

在这里插入图片描述

作⽤:可以在服务器端获取该头的信息,解决浏览器的兼容性问题
作⽤:防盗链

步骤: 用一个当前应用体的页面访问下面的这个资源,再用一个外面的应用体访问这个资源,外面的应用体被阻挡,无法访问。

package b_referer;

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 java.io.IOException;

/**
 * 这里模拟的是一个要访问的资源
 */
@WebServlet("/Demo3Servlet")
public class Demo03Servlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 处理盗链
        String referer = req.getHeader("referer");
        // 判断来源是不是当前应用
        if (referer == null || referer.contains("/day03_war_exploded")) {
            resp.getWriter().write("success! hi everybody~");
        } else {
            System.out.println("你个小偷, 走开");
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

6 通过request获得请求体

请求体:只有POST请求⽅式,才有请求体,在请求体中封装了POST请求的请求参数。

步骤:

  1. 获取流对象
    BufferedReader getReader():获取字符输⼊流,只能操作字符数据

2、ServletInputStream getInputStream():获取字节输⼊流,可以操作所有类型数据

package c_parameter;

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

@WebServlet("/Demo04Servlet")
public class Demo04Servlet extends HttpServlet {
    // 获得请求参数
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // get请求参数在URI上  ?后面的参数
        String queryString = req.getQueryString();
        // username=lucy&password=111
        System.out.println(queryString);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // post请求参数在请求体里 -> 输入流
        ServletInputStream is = req.getInputStream();
        byte[] bytes = is.readAllBytes();// 读取所有字节
        String s = new String(bytes);//将字节数组转换成字符串
        // name=lisi&age=18
        System.out.println(s);
    }
}

7 request的其他功能

7.1 获取请求参数

不论get还是post请求⽅式都可以使⽤下列⽅法来获取请求参数

1. String getParameter(String name):根据参数名称获取参数值 
username=zs&password=123
2. String[] getParameterValues(String name):根据参数名称获取参数值的数组 
hobby=xx&hobby=game
3. Enumeration<String> getParameterNames():获取所有请求的参数名称
4. Map<String,String[]> getParameterMap():获取所有参数的map集合

7.2 中⽂乱码问题

get⽅式:tomcat 8 已经将get⽅式乱码问题解决了,都是utf-8
post⽅式:会乱码(是ISO8859-1)

乱码问题:
     Post提交: ISO8859-1 字符集 - 流
     Get提交: 跟tomcat字符集一致 UTF8
          修改tomcat字符集, 在修改端口的地方, 添加 URIEncoding="字符集"
          tomcat8之前, 默认字符集是 ISO8859-1
          tomcat8开始, 默认字符集就是 UTF8

== 解决:在获取参数前,设置request的编码request.setCharacterEncoding(“utf-8”); ==
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值