zoukankan      html  css  js  c++  java
  • HttpServletRequest简介

    HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息。

    常用方法:

    1.获得客户机【浏览器】信息

    • getRequestURL方法返回客户端发出请求时的完整URL。

    • getRequestURI方法返回请求行中的资源名部分。

    • getQueryString 方法返回请求行中的参数部分。

    • getPathInfo方法返回请求URL中的额外路径信息。额外路径信息是请求URL中的位于Servlet的路径之后和查询参数之前的内容,它以“/”开头。

    • getRemoteAddr方法返回发出请求的客户机的IP地址

    • getRemoteHost方法返回发出请求的客户机的完整主机名

    • getRemotePort方法返回客户机所使用的网络端口号

    • getLocalAddr方法返回WEB服务器的IP地址。

    • getLocalName方法返回WEB服务器的主机名

    2.获得客户机请求头

    • getHeader方法

    • getHeaders方法

    • getHeaderNames方法

    3.获得客户机请求参数(客户端提交的数据)

    • getParameter方法

    • getParameterValues(String name)方法

    • getParameterNames方法

    • getParameterMap方法

    应用1-防盗链(利用请求头中的Referer属性)

    获取Referer这个消息头判断Referer是不是从我的首页来的。如果不是从我的首页来的,跳转回我的首页

    //获取到网页是从哪里来的
    String referer  = request. getHeader ( "Referer" );
    //如果不是从我的首页来或者从地址栏直接访问的,
    if ( referer  == null || ! referer. contains ( "localhost:8080/zhongfucheng/index.jsp" ) 
    {  
    //回到首页去
        response.sendRedirect ( "/zhongfucheng/index.jsp" );   
      return ;   
    }
           
    //能执行下面的语句,说明是从我的首页点击进来的,那没问题,照常显示
      response.setContentType ( "text/html;charset=UTF-8" );
      response.getWriter (). write ( "防链盗ok" );
    • 如果我在浏览器直接输入地址【此时Referer是为null的】。

    解决中文乱码问题

    1.post提交乱码

    来这里我们来分析一下乱码的原因,在前面的博客中我已经介绍了,Tomcat服务器默认编码是ISO 8859-1,而浏览器使用的是UTF-8编码。浏览器的中文数据提交给服务器,Tomcat以ISO 8859-1编码对中文编码,当我在Servlet读取数据的时候,拿到的当然是乱码。而我设置request的编码为UTF-8,乱码就解决了。

    2.get提交乱码

      request.setCharacterEncoding("UTF-8");

      String name = request.getParameter("name");

    结果还是乱码。这是为什么呢?我明明已经把编码设置成UTF-8了,按照post方式,乱码问题已经解决了!。我们来看看get和post方式的区别在哪?为什么post方式设置了request编码就可以解决乱码问题,而get方式不能呢。

    首先我们来看一下post方法是怎么进行参数传递的。当我们点击提交按钮的时候,数据封装进了Form Data中http请求中把实体主体带过去了【传输的数据称之为实体主体】,既然request对象封装了http请求,所以request对象可以解析到发送过来的数据,于是只要把编码设置成UTF-8就可以解决乱码问题了

     而get方式不同,它的数据是从消息行带过去的,没有封装到request对象里面,所以使用request设置编码是无效的。

    • 要解决get方式乱码问题也不难,我们既然知道Tomcat默认的编码是ISO 8859-1,那么get方式由消息体带过去给浏览器的时候肯定是用ISO 8859-1编码了

    •        //此时得到的数据已经是被ISO 8859-1编码后的字符串了,这个是乱码
      
             String name = request.getParameter("username");
      
             //乱码通过反向查ISO 8859-1得到原始的数据
      
             byte[] bytes = name.getBytes("ISO8859-1");
      
             //通过原始的数据,设置正确的码表,构建字符串
      
             String value = new String(bytes, "UTF-8");

      除了手工转换,get方式还可以改Tomcat服务器的配置来解决乱码,但是不推荐使用,这样不灵活。

    • “我们都知道Tomcat默认的编码是ISO 8859-1,如果在Tomcat服务器的配置下改成是UTF-8的编码,那么就解决服务器在解析数据的时候造成乱码问题了。
    • <Connector port="8080" protocol="HTTP/1.1"
    • connectionTimeout="20000"
    • redirectPort="8443" URIEncoding="utf-8"/>
    • 当然也有另一种改服务器编码的方式。设置Tomcat的访问该端口时的编码为页面的编码,这种改法是随着页面的编码而变

    1.    <Connector port="8080" protocol="HTTP/1.1"

    2.               connectionTimeout="20000"

    3.               redirectPort="8443" useBodyEncodingForURI="true" />

    • 设置编码为UTF-8

    1.        request.setCharacterEncoding("UTF-8");

    2.        String name = request.getParameter("name");

    应用2-实现转发

    我们可以使用ServletContext和request实现Servlet之间的通讯,那么我们用哪一种呢?一般的原则:可以使用request就尽可能使用request。因为ServletContext代表着整个web应用,使用ServletContext会消耗大量的资源,而request对象会随着请求的结束而结束,资源会被回收使用request域进行Servlet之间的通讯在开发中是非常频繁的

    转发时序图如下

    请求转发的细节

    • 如果在调用forward方法之前,在Servlet程序中写入的部分内容已经被真正地传送到了客户端,forward方法将抛出IllegalStateException异常。 也就是说:不要在转发之前写数据给浏览器

    •  如果在调用forward方法之前向Servlet引擎的缓冲区中写入了内容,只要写入到缓冲区中的内容还没有被真正输出到客户端,forward方法就可以被正常执行,原来写入到输出缓冲区中的内容将被清空,但是,已写入到HttpServletResponse对象中的响应头字段信息保持有效

  • 相关阅读:
    ArrayList和Vector的比较
    ExtJs与jQuery的比较
    列表类型的内建函数
    序列类型函数
    SQL函数
    HTTP状态码
    序列切片
    数值运算
    数值类型转换
    Python中is和==的区别
  • 原文地址:https://www.cnblogs.com/hongchengshise/p/10381423.html
Copyright © 2011-2022 走看看