Servlet学习笔记(三)之HttpServletRequest

HttpServletRequest(HttpServletRequest 想比 ServletRequest 添加与协议相关 API)对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户信息。

通过Request对象进行的常用操作:

  • 获取客户机信息
  • 获取请求头信息
  • 获取请求参数
  • 利用请求域传递对象

这里写图片描述

(一)获取客户机信息

常用方法:

public String getContextPath();/获取请求的上下文路径
public StringBuffer getRequestURL();/返回客户端发出请求的完整URL
public String getRequestURI();/返回请求行中的资源名部分
public String getQueryString();/返回请求行中的参数部分
public String getMethod();/返回客户机请求方式,如get,post等
public String getRemoteAddr();/返回发出请求的客户机的IP地址
public class RequestServlet1 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 问题一 区分 getRequestURL 和 getRequestURI
        System.out.println("url:" + request.getRequestURL());
        System.out.println("uri:" + request.getRequestURI()); // 返回
        // /day06/request1

        // 问题二:了解 通过 getQueryString 可以获得 get方式提交查询串 url中?后面部分
        System.out.println("querystring:" + request.getQueryString());

        // 获得客户端ip
        System.out.println("ip: " + request.getRemoteAddr());

        // 通过 getContextPath 获得工程虚拟目录名称
        System.out.println(request.getContextPath()); // 返回 /requesttest

        // 通过getMethod 获得请求方式
        System.out.println("请求方式 : " + request.getMethod());

        // 问题: 获得当前访问资源路径 --- /request1
        System.out.println("当前访问资源路径 :"
                + request.getRequestURI().substring(
                        request.getContextPath().length()));

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}

输出:

url:http://localhost:8080//requesttest/request1
uri://requesttest/request1
querystring:null
ip: 127.0.0.1
//requesttest
请求方式 : GET
当前访问资源路径 :/request1

区别URL(统一资源定位符)与URI(统一资源标识符):
url:http://localhost/requesttest/request1 — 完整
uri:/requesttest/request1 —- 部分

URI 包含 URL的 ,URL 一定完成路径,URI可以相对路径
http://localhost/requesttest/request1 是一个URL 同时也是 URI
./hello /requesttest/request1 —- 都是URI 不是URL

querystring:null
由于请求中没有查询串,因此querystring为null,如果改成http://localhost/requesttest/request1?username=megustas则输出变为

querystring:username=megustas

即通过 getQueryString 可以获得 get方式提交查询串 url中?后面部分

获得当前访问资源路径 :

request.getRequestURI().substring(request.getContextPath().length());

在URI的基础上去掉工程虚拟目录名称的部分,剩下的就是当前访问的资源的路径。

(二)获取请求头信息

getHeader 获得头信息的值,转换一个字符串
getHeaders 获得头信息值 ,获得Enumeration
getHeaderNames 获得所有头信息名称 返回 Enumeration

  • 掌握getHeader使用,遍历Enumeration 获得所有头信息
public class RequestServlet2 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        System.out.println("test...");
        // 获得指定头信息字段 Accept-Encoding: gzip, deflate
        String value = request.getHeader("Accept-Encoding"); // 如果头信息存在多个值,将多个值拼接到一起,形成String
        System.out.println(value); // gzip, deflate

        System.out.println("--------------------------------");
        // 获得所有头信息内容 ---- 获得所有头信息名称
        Enumeration<String> enumeration = request.getHeaderNames();
        while (enumeration.hasMoreElements()) {
            String name = enumeration.nextElement(); // name 就是一个头信息名字
            System.out.println(name + ":" + request.getHeader(name));
        }

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}

通过头信息可以进行防盗链,存在合法referer不是盗链,否则控制目标资源无法访问 (因为直接输入网址的情况没有refer的头信息)
* 通过URL 绕过盗链判断

(三)获取请求参数

请求参数:用户通过请求提交服务器的一些数据—–< a href=”url?xxx=xxx” >、< form method=”get”> 、 < form method=”post”>

可以通过getParameter(name)方法来获取
html页面:

<body>
   <h1>分别以get 和 post方式 提交数据</h1>
   <h1>第一种 通过超链接 提交数据 以?方式</h1>
   <!-- 包括两个参数的 name 和 city -->
   <a href="/requestexample/request4?name=zhangsan&city=beijing">超链接提交数据</a>
   <h1>第二种 通过form的post方式提交数据</h1>
   <form action="/requestexample/request4" method="post">
      请输入姓名 <input type="text" name="name" /><br/>
     请输入城市 <input type="text" name="city" /> <br/>
     <input type="submit" value="提交" />
   </form>  
</body>
public class RequestServlet4 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 通过getParameter 获得请求数据
        String name = request.getParameter("name");
        System.out.println(name);
        String city = request.getParameter("city");
        System.out.println(city);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值