JAVAWeb-Http之请求

http:协议

    对浏览器和服务器之间数据传输格式的规范!
tcp/ip协议:
专注的是客户端和服务端之间数据是否传输成功
http协议:
就是在tcp/ip协议的基础上封装的一套协议,专注于客户端和服务端数据传输格式是否一致

http请求

GET /day08/first HTTP/1.1       请求行 应俩个空格分开
Host:localhost:8080         请求头以键值对形式出现)
User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding:gzip, deflate, br
Accept-Language:zh-CN,zh;q=0.8
Connection:keep-alive
                            一个空行
name=eric&password=2346     实体内容

2.请求行:

1)http协议版本:
    http1.0:当浏览器和服务器连接之后,在一次连接中只能发出一个请求
    http1.1当浏览器和服务器连接之后,在一次连接中可以发出多行请求(效率比1.0更高)
常见的问题:
    在一个HTML页面,在页面上有三张页面,访问这个HTML页面,问一共发出几次请求
答案:
    4次(HTML页面,获取资源需要请求 link src img 导入其他资源文件的)
2)请求的资源: 请求服务器的哪个文件
    /day08/first:URI    统一资源描述符,可以描述任何文件,本地,互联网

    http://localhost:8080/day08/first   URL:统一资源定位符,互联网(基于http协议)是URI的子集

3)GET请求的方式(提交方式)
    http请求方式GET POST HEAD PUT CONNECT...
    <form action="提交地址" method="get/post";
    区别:
    GET:提交的参数显示到地址栏
        原理:get提交的参数会跟在请求行内容的URL后面:
        以?开始,每个参数用=号分开,name=Jack
        第二个参数之后使用&符号链接
        ?name=javd&password=12346
    2)不适合存放敏感数据
    3)不超过1kb
    POST:提交的数据不会显示到地址栏
        原理:
            post提交的参数会跟在请求的实体内容中
            第二个参数用&链接
            name=javd&password=12346
        2)适合敏感数据
        3)提交的大小没有限制

2.1请求头

    Accept:text/html,image/*        浏览器接受的数据类型
    Accept-Charset:ISO-8859-1   浏览器接受的数据编码格式
    Accept-Encoding:gzip,compress   浏览器接受的数据压缩格式
    Accept-Language:en-us,zh-   浏览器接受的语言
    Host:www.it315.org:80       请求发出的主机和端口号(必须)
    If-Modifi-Since:Tue,11 jul 2000 18:23:51 GMT    浏览器缓存的最后修改时间
    Referer:http://www,it315.org/index.jsp          当前请求来自于哪里(防止非法链接)
    User-Agent:Mozilla/4.0(compatible;MSIE5.5;Windoes NT5.0)    浏览器类型
    Cookie:name=eric            浏览器保存的cookie数据
    Connection:colse/Keep-Alive 浏览器和服务器的连接状态 close 关闭  keep-alive:保持链接
    Date:Tue,11 Jul 2000 18:23:51 GMT   请求发出的时间

    使用HttpServletRequset获取请求信息
        1)Tomcat服务器接收到浏览器发送的请求数据
        2)Tomcat服务器把请求数据封装成HttpServletRequest对象
        3)Tomcat服务器调用doGet方法,把request对象传到servlet

    HttpServletRequest对象:获取请求数据
        请求行
            请求方式    request.getMethod()
            请求资源    request.getRequestURI()/request.getRequestURL()
            http协议版本:request.getProtocol();
        请求头
            request.getHeader("name");
            request.getHeaderNames();
        获取内容:
            request.getInputStream();
service方法是servlet的核心服务方法,我们的业务逻辑都是在这个方法开始被触发的
结论service方法和doXXX的关系
    1)service方法是程序的入口,我们的代码逻辑就在这个方法被调用到
    2)在HtppServlet的service方法的源码中,根据不同的请求方式调用了不同的doXXX 
        所以我们在开发中servlet的时候,就不需要去覆盖service方法,而是去doXXX方法
        因为get和post是最常用的俩种请求方式,所以我们只需要一个doGet和doPost即可!

2.3案例user-agent
    response.setContentType("text/html;charset=utf-8");
            //获取浏览器属性
            String header = request.getHeader("user-agent");
            System.out.println(header);
            if(header.contains("Firefox")){
                response.getWriter().write("你正在使用火狐浏览器");
            }else if(header.contains("Chrome")){
                response.getWriter().write("你正在使用谷歌浏览器");
            }else if(header.contains("Trident")){
                response.getWriter().write("你正在使用IE浏览器");
            }else {
                response.getWriter().write("你使用其他的浏览器");

            }
2.4案例referer 防止非法链接
    第一次:下载资源->下载页面->打开广告页面(下载链接)->开始下载
    第二次:直接点击下载链接->跳转广告页面(下载链接)开始链接
    非法请求:
        1)直接访问下载资源
        2)不是从广告页面过来的请求
    referer:请求只有从超链接过来的请求才有这个头
/**
         * 代表下载资源
         * referer:表示当前请求来自于哪里
         */
        String referer = request.getHeader("referer");
        System.out.println(referer);
        /**
         * 非法请求
         *  1)直接访问(request==null)   
         *  2)当前访问不是来自于广告页面(!referer.contains("adv.html");
         */
        if(referer==null  || !referer.contains("adv.html")){
            response.getWriter().write("你当前请求不合法,请回到"+"<a href='/JavaWebTestOne/adv.html'>首页</a>");
        }
        else{
            response.getWriter().write("正在下载...........");
2.5获取参数的数据
    get:放在请求行的URI后面
    post:放在请求的实体内容
问题的:
    1)获取打的参数数据,还需要进一步处理,获取参数值
    2)俩种提交方式的获取完全不一样,不通用

通用的获取参数的方法(无论get和poet可用)

request.getParameter(”name“);//根据参数名称获取数值(参数名称就是表单里里面的name属性值)
request.getParameterNames();//获取所有参数名称列表
request.getParameterMap();//获取参数对象的列明(Map集合)
request。getParameterValues(“”)根据参数名称获取多个参数值
每个map的对象就是一个参数(包括参数名称和参数值)
key:参数的名称
value:参数值 默认情况下都是多个值的参数

复习Map集合
    问题:Map集合如何遍历
        1)entrySet()
        2)keySet()
        3)values()
    1)entrySet()方法;获取键值对对象的Set集合
    Entry对象中包含一个键对象,和一个值对象
    Set<Entry<String,String[]>> entry=map.entrySet();
    for(Entrey<String,String[]> entry: entrySet){
        获取键对象 
            String key=entry.getKey();
        获取值对象(数组的第一个元素就是参数值)
            String[] value=entry.getValue();
        }
    2)keySet():湖区所有键值对象的Set集合
        Set<String> keySet=map.keySet()
        for(String key: keySet){
            String[] value=map.get(key);
        }
    3)values():获取所有对象的collection集合(只能获取值对象,不能获取键对象)
    Collection<String[]> values=map.values();
    for(String[] value:values){

        }


    在出现解码问题出现乱码时
        修改解码是查询的码表
        reques.setCharacterEncoding(""utf-8);
        注意:必须放在所有获取参数的代码之前
        只能解决post的乱码对get提交的是无效的
        因为这个方法只能设置对请求实体内容的解码时查询的码表
        post提交的参数是放在了实体内容中,所以对post是有效的
        但是get提交参数是放在URI后面这个方法无法影响URI后面的内容

        如果是post
            reque.setCharEncoding("utf-8'")
        如果是get
            手动对参数内容从新解码
            String value=request.getParameter("name");  iso-8859-1
            String value=new String(value.getBytes("iso-8859-1"),"utf-8");
        if("GET“.0equals.(request.getMethod())){
            String value=new String(value.getBytes("iso-8859-1"),"utf-8");
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值