一】Request对象常用方法
        1)StringBuffer getRequestURL()
            url表示访问web应用的完整路径    
        2)String getRequestURI()
            uri表示访问web应用的资源路径
        3)String getQueryString()
            queryString表示:?开头的参数;
        4)getPathInfo()
            pathInfo方法:表示路径之外的信息,如果没有返回null
        5)关于IP
            取得客户端IP:String getRemoteAddr();
            取得服务端IP:String getLocalAddr();
        6)关于主机名
            取得客户端主机名:String getRemoteHost();
            取得服务端主机名:String getLocalName();
        7)关于通信端口
            取得客户端使用的通信端口:String getRemotePort();
            取得服务端使用的通信端口:String getLocalPort();
        
        
        
        code:
                //获取请求的全路径
                String url = request.getRequestURL().toString();
                //获取请求的资源路径
                String uri = request.getRequestURI();
                //获取请求的参数
                String query = request.getQueryString();
                //获取其它信息
                String pathInfo = request.getPathInfo();
                
                System.out.println("-----------------------");
                System.out.println("url:" + url);
                System.out.println("uri:" + uri);
                System.out.println("query:" + query);
                System.out.println("pathinfo:" + pathInfo);
                System.out.println("-----------------------");
                
                
                //获取本机信息
                System.out.println("IP"+request.getLocalAddr());
                System.out.println("主机名"+request.getLocalName());
                System.out.println("端口"+request.getLocalPort());
                System.out.println("-----------------------");
                
                //获取客户端信息
                System.out.println("IP"+request.getRemoteAddr());
                System.out.println("主机名"+request.getRemoteHost());
                System.out.println("端口"+request.getRemotePort());
                System.out.println("-----------------------");
                
            }
        
            
            
            /*
            
             输出结果:
             -----------------------
            url:http://localhost:8080/day07/Demo1
            uri:/day07/Demo1
            query:name=jack
            pathinfo:null
            -----------------------
            IP127.0.0.1
            主机名localhost
            端口8080
            -----------------------
            IP127.0.0.1
            主机名127.0.0.1
            端口3037
            -----------------------
    */

8)取得请求头相关的信息
            1》获取单个请求头的唯一值
                    String getHeader("请求头名称");
            2》获取单个请求头的多个值(有些请求头不不止一个值)
                    Enumeration getHeaders("请求头名称");
            3》获取全部请求头的名称
                    Enumeration getHeaderNames();
        9)取得请求体的相关信息
            1》当一个参数仅有一个值的时候
                String getParamter(String param-name);
            2》当一个参数有多个值的时候
                String[] getParamterValues(String param-name);
            注意:如果是GET的请求方式,如果找不到参数对应的值,就返回一个null
        10)取得请求行的类型。
            String getMethod();
    
    
    二】BeanUtils框架 + getParamterNames()的方式
        优点:
                1》无需理会参数的类型,个数,Beanutils框架能自动将String参数设置到JavaBean对象中
                2》String <->  8种基本类型自动转换,非8种基本类型可以注册转换器
                3》String和String[]类型的参数自动感知装配
        code:
            Enumeration<String> paramNames = request.getParameterNames();
            User user = new User();
            BeanUtils beanUtils = new BeanUtils();
            while(paramNames.hasMoreElements()) {
                String key = paramNames.nextElement();
                String[] value = request.getParameterValues(key);
                try {
                    beanUtils.setProperty(user, key, value);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
    三】request常见应用 -----防盗链(下载文件,必须从指定网站进入,否则不允许下载文件)
        原理:判断某个请求来自于哪个网页,使用referer请求头
    code:
            //取得浏览器来自于何方
            String referer = request.getHeader("referer");
            
            //判段
            if(referer!=null && referer.equals("http://localhost/day07/index.html")){
                //转发到download.html页面
                this
                    .getServletContext()
                    .getRequestDispatcher("/down.html")
                    .forward(request,response);
            }else{
                //转发到ad.html页面
                this
                .getServletContext()
                .getRequestDispatcher("/ad.html")
                .forward(request,response);
            }
        }
        
        注意:在获取用户名等信息的时候必须要加一句判断
            if(username != null || username.trim().length()>0)
    四】获取表单提取的信息
        重点方法:
            void setCharacterEncoding(String env);//将请求体的编码方式进行更改
        原理:
        利用getparameter()和getparameterNames()方法

五】POST方式请求体中参数的中文乱码
        原因:
            1》POST方式的表单请求参数放在请求体中
            2》浏览器的默认编码方式是utf-8,与tomcat中Request对象的默认的编码方式是ISO8859-1不一样
        解决办法:
            通过void setCharacterEncoding(String env);方法设置response对象在对中文字符进行编码和解码的时候使用指定的编码方式
            注意:该方法只能解决请求体中的乱码问题。其它部分不能解决。
        code:
            
    六】GET方式请求参数的中文乱码问题    
        原因:
            1》POST方式的表单请求参数放在请求行中
            2》浏览器的默认编码方式是utf-8,与tomcat中Request对象的默认的编码方式是ISO8859-1不一样
        解决办法:
            客户端:进行中文编码,防止服务端进行解码的时候产生不可逆的错误
                    1》使用URLEncoder类的encode()方法
                    2》在客户端将中文字符进行编码,再将已经经过编码的数据发送给服务器
                    
                
                思考:
                    先进行编码的原因:
                        1》中文字符通过ISO8859-1直接解码会导致不可逆的解码错误
                        2》而先经过编码后的中文字符变成了ISO8859-1编码和解码支持的字符。
                        3》所以需要先进行一次编码。
                    
        服务器:
            1》当服务器收到数据的时候,先要经过一次解码,此解码方式采用ISO8859-1(相当于再包装)
            2》所以要获取到中文字符,需要先对外面一层通过服务器自动解码产生的数据进行一次编码
            3》最后再对里面的一层进行一次和客户端一样方式的解码
        
        code:
            jsp页面:
                 <a href="/day07/DemoServlet?username=<%=URLEncoder.encode("小强", "utf-8") %>">GET方式传递中文</a>
                
            Servlet:
                String isoUsername = request.getParameter("username");
                byte[] buf = isoUsername.getBytes("ISO8859-1");
                String username = new String(buf, "utf-8");
                
                System.out.println("username = " + username);
                    
补充:
    405状态码:如果客户端本身的请求是Get请求,但是在Servlet类中却为提供对应的doGet()方法时,
                            Post也是出现此种错误。    
                            
                            
总结:
        1》转发是通过RequestDispatcher对象方法forward(request,response)方法完成。
                获取RequestDispatcher的两个方法:
                    this.getServletContext().getRequestDispatcher();
                    request.getRequestDispatcher();
        2》forward()方法 的输出,如果是输出到缓冲区,再转发到其它Servlet,那么原缓冲区的数据忽略不计;
             forward()方法之前的输出,如果真正输出到浏览器,再转发到其它Servlet,则转发到的Servlet的输出便忽略不计了。
             但是,已经写入到了response对象中的响应头还是保留,因为响应头的内容并不属于流的内容,不需要缓冲。

Request对象 --web浏览器向web服务端的请求的更多相关文章

  1. SignalR 实现web浏览器客户端与服务端的推送功能

    SignalR 是一个集成的客户端与服务器库,基于浏览器的客户端和基于 ASP.NET 的服务器组件可以借助它来进行双向多步对话. 换句话说,该对话可不受限制地进行单个无状态请求/响应数据交换:它将继 ...

  2. Spring Boot构建的Web项目如何在服务端校验表单输入

    本文首发于个人网站:Spring Boot构建的Web项目如何在服务端校验表单输入 这个例子用于演示在Spring Boot应用中如何验证Web 应用的输入,我们将会建立一个简单的Spring MVC ...

  3. Web浏览器与Web服务器之间的通信过程

     HTTP通信机制是在一次完整的HTTP通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤:1:建立TCP连接 在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器建立连接,该连 ...

  4. http通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤

    http通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤: (1)    建立TCP连接 在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器建立连接,该连接是通过TCP来完成 ...

  5. Query通过Ajax向PHP服务端发送请求并返回JSON数据

    Query通过Ajax向PHP服务端发送请求并返回JSON数据 服务端PHP读取MYSQL数据,并转换成JSON数据,传递给前端Javascript,并操作JSON数据.本文将通过实例演示了jQuer ...

  6. 3.菜鸟教你一步一步开发 web service 之 axis 服务端创建

    转自:https://blog.csdn.net/shfqbluestone/article/details/37610601 第一步,新建一个工程,如图: 选 Java 写一个工程名,选择好工程路径 ...

  7. JSON Web Token (JWT),服务端信息传输安全解决方案。

    JWT介绍 JSON Web Token(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑独立的基于JSON对象在各方之间安全地传输信息的方式.这些信息可以被验证和信任,因为它是数字签名的 ...

  8. 【Web】CXF WebService 服务端和客户端 环境搭建及测试

    cxf服务端 1.去官方下载对应的jar包:http://cxf.apache.org/ 2.maven配置相应jar包 3.修改web.xml,完成spring和cxf配置 <!-- Spri ...

  9. .Net之使用Jquery Ajax通过FormData对象异步提交图片文件到服务端保存并返回保存的图片路径

    前言: 首先对于图片上传而言,在我们的项目开发中可以说出现的频率是相当的高的.这篇文章中,我将要描述的是在我们.Net中如何使用Jquery Ajax通过FormData对象异步提交图片文件到后台保存 ...

随机推荐

  1. 【HDOJ】3316 Mine sweeping

    简单BFS. #include <iostream> #include <cstdio> #include <cstring> #include <cstdl ...

  2. jquery+css实现菜单收缩效果并适应多种浏览器与移动平台

    效果 出现 css部分 .content-wrapper{ -webkit-transition: -webkit-transform .3s ease-in-out, margin .3s ease ...

  3. COJ 0020 30201象棋中的皇后

    30201象棋中的皇后 难度级别:B: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 在n×m的棋盘上放置两个相互攻击的皇后,总共有多少种不同 ...

  4. Linux企业级项目实践之网络爬虫(30)——通过查阅RFC文档扩充更加复杂的功能

    HTTP是一种很简单的请求.响应式协议,客户端发送一个请求.服务器返回一个响应.HTTP 1.1 版本规范由 RFC2616 定义.了解了 HTTP请求.响应消息在TCP数据流中的格式,很容易使用纯 ...

  5. 黑马程序员_JavaIO流(一)

    IO(Input Output)流 概述: IO流(数据流)用来处理设备之间的数据传输. Java对数据的操作是通过流的方式. Java用于操作流的对象都在IO包中. 流按操作数据分为两种:字节流与字 ...

  6. .net连接oracle(无客户端)

    使用DDTek.Oracle.dll可以在没有安装oracle客户端的情况下连接远程的oracle. string _conString = "Host=192.168.1.1;Port=1 ...

  7. MTM量身定制系统 - 富友ERP产品 - 信息化推动服装行业管理软件升级

    MTM量身定制系统 - 富友ERP产品 - 信息化推动服装行业管理软件升级 国内第一款量体定制管理系统               结合富友软件10年服装行业经验和多家大型量身定制企业管理经验,推出的 ...

  8. 将vs2012建的项目转换为vs2010项目

    vs2012建的项目vs2010打不开,但vs2010的项目vs2012能打开,所以我觉得vs2012没有对解决方案进行重大的调整,尝试修改了一下.sln文件,使用vs2010就能打开了,方法如下: ...

  9. 自定义listView添加滑动删除功能

    今天研究了一下android里面的手势,结合昨天学习的自定义View,做了一个自定义的listview,继承自listView,添加了条目的滑动手势操作,滑动后出现一个删除按钮,点击删除按钮,触发一个 ...

  10. Appium依据xpath获取控件实例随笔

    如文章<Appium基于安卓的各种FindElement的控件定位方法实践>所述,Appium拥有众多获取控件的方法.当中一种就是依据控件所在页面的XPATH来定位控件. 本文就是尝试通过 ...