zoukankan      html  css  js  c++  java
  • Request对象 --web浏览器向web服务端的请求

        一】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对象中的响应头还是保留,因为响应头的内容并不属于流的内容,不需要缓冲。

  • 相关阅读:
    angular-ui-bootstrap插件API
    简易富文本编辑器bootstrap-wysiwyg源码注释
    deployd使用归纳
    初步学习nodejs,业余用node写个一个自动创建目录和文件的小脚本,希望对需要的人有所帮助
    COCOS2D-JS入门-官网template源码解析
    COCOS2D-JS入门-web端项目部署
    jQuery 插件格式
    react native 使用 native-echarts 在安卓上无法显示解决办法
    springboot项目启动报错Failed to configure a DataSource: 'url' attribute is not specified and no embedde
    Mac 上 Class JavaLaunchHelper is implemented in both 报错
  • 原文地址:https://www.cnblogs.com/SkyGood/p/3977278.html
Copyright © 2011-2022 走看看