httpservletrequest的概念

21 篇文章 0 订阅

转载自百度百科及:http://blog.csdn.net/redarmy_chen/article/details/8157053


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

一、HttpServletRequest接口      
定义
public   interface   HttpServletRequest   extends   ServletRequest;
用来处理一个对Servlet的HTTP格式的请求信息。
方法
1、getAuthType
public   String   getAuthType();
返回这个请求的身份验证模式。
2、getCookies
public   Cookie[]   getCookies();
返回一个 数组,该数组包含这个请求中当前的所有cookie。如果这个请求中没有cookie,返回一个 空数组
3、getDateHeader
public   long   getDateHeader(String   name);
返回指定的请求头域的值,这个值被转换成一个反映自1970-1-1日(GMT)以来的精确到毫秒的长整数。
如果头域不能转换,抛出一个IllegalArgumentException。如果这个请求头域不存在,这个方法返回-1。
4、getHeader
public   String   getHeader(String   name);
返回一个请求头域的值。(译者注:与上一个方法不同的是,该方法返回一个字符串)
如果这个请求头域不存在,这个方法返回-1。
5、getHeaderNames
public   Enumeration   getHeaderNames();
该方法返回一个String对象的列表,该列表反映请求的所有头域名。
有的引擎可能不允许通过这种方法访问头域,在这种情况下,这个方法返回一个空的列表。
6、getIntHeader
public   int   getIntHeader(String   name);
返回指定的请求头域的值,这个值被转换成一个整数。
如果头域不能转换,抛出一个IllegalArgumentException。如果这个请求头域不存在,这个方法返回-1。
7、getMethod
public   String   getMethod();
返回这个请求使用的HTTP方法(例如:GET、POST、PUT)
8、getPathInfo
public   String   getPathInfo();
这个方法返回在这个请求的URL的Servlet路径之后的请求URL的额外的路径信息。如果这个请求URL包括一个查询字符串,在返回值内将不包括这个查询字符串。这个路径在返回之前必须经过URL解码。如果在这个请求的URL的Servlet路径之后没有路径信息。这个方法返回 空值
9、getPathTranslated
public   String   getPathTranslated();
这个方法获得这个请求的URL的Servlet路径之后的额外的路径信息,并将它转换成一个真实的路径。在进行转换前,这个请求的URL必须经过URL解码。如果在这个URL的Servlet路径之后没有附加路径信息。这个方法返回 空值
10、getQueryString
public   String   getQueryString();
返回这个请求URL所包含的查询字符串。一个查询字串符在一个URL中由一个“?”引出。如果没有查询字符串,这个方法返回空值。
11、getRemoteUser
public   String   getRemoteUser
返回作了请求的用户名,这个信息用来作HTTP用户论证。
如果在请求中没有用户名信息,这个方法返回空值。
12、getRequestedSessionId
public   String   getRequestedSessionId();
返回这个请求相应的session   id。如果由于某种原因 客户端提供的session   id是无效的,这个session   id将与在当前session中的session   id不同,与此同时,将建立一个新的session。
如果这个请求没与一个session关联,这个方法返回空值。
13、getRequestURI
public   String   getRequestURI();
HTTP请求的第一行返回请求的URL中定义被请求的资源的部分。如果有一个查询字符串存在,这个查询字符串将不包括在返回值当中。例如,一个请求通过/catalog/books?id=1这样的URL路径访问,这个方法将返回/catalog/books。这个方法的返回值包括了Servlet路径和路径信息。
如果这个URL路径中的的一部分经过了URL编码,这个方法的返回值在返回之前必须经过解码。
14、getServletPath
public   String   getServletPath();
这个方法返回请求URL反映调用Servlet的部分。例如,一个Servlet被映射到/catalog/summer这个URL路径,而一个请求使用了/catalog/summer/casual这样的路径。所谓的反映调用Servlet的部分就是指/catalog/summer。
如果这个Servlet不是通过 路径匹配来调用。这个方法将返回一个空值。
15、getSession
public   HttpSession   getSession();
public   HttpSession   getSession(boolean   create);
返回与这个请求关联的当前的有效的session。如果调用这个方法时没带参数,那么在没有session与这个请求关联的情况下,将会新建一个session。如果调用这个方法时带入了一个布尔型的参数,只有当这个参数为真时,session才会被建立。
为了确保session能够被完全维持。Servlet开发者必须在响应被提交之前调用该方法。
如果带入的参数为假,而且没有session与这个请求关联。这个方法会返回空值。
16、isRequestedSessionIdValid
public   boolean   isRequestedSessionIdValid();
这个方法检查与此请求关联的session当前是不是有效。如果当前请求中使用的session无效,它将不能通过getSession方法返回。
17、isRequestedSessionIdFromCookie
public   boolean   isRequestedSessionIdFromCookie();
如果这个请求的session   id是通过 客户端的一个cookie提供的,该方法返回真,否则返回假。
18、isRequestedSessionIdFromURL
public   boolean   isRequestedSessionIdFromURL();
如果这个请求的session   id是通过 客户端的URL的一部分提供的,该方法返回真,否则返回假。请注意此方法与isRequestedSessionIdFromUrl在URL的拼写上不同。
以下方法将被取消
19、isRequestedSessionIdFromUrl
public   boolean   isRequestedSessionIdFromUrl();
该方法被isRequestedSessionIdFromURL代替。



一、通过request常用方法获得相关信息:

1、通过request常用方法获得客户机信息

  •     getRequestURL方法返回客户端发出请求时的完整URL。
  • getRequestURI方法返回请求行中的资源名部分。
  • getQueryString 方法返回请求行中的参数部分。
  • getRemoteAddr方法返回发出请求的客户机的IP地址
  • getRemoteHost方法返回发出请求的客户机的完整主机名
  • getRemotePort方法返回客户机所使用的网络端口号
  • getLocalAddr方法返回WEB服务器的IP地址。
  • getLocalName方法返回WEB服务器的主机名
  • getMethod得到客户机请求方式

例如在Request.java中加入如下代码:

[java] view plaincopy

    //返回相关请求的信息  
               String uri=request.getRequestURI();  
                  Stringrad = request.getRemoteAddr();  
                  Stringrh = request.getRemoteHost();  
                  Stringru = request.getRemoteUser();  
                  intrp = request.getRemotePort();  
                  Stringcp = request.getContextPath();  
                  Stringla = request.getLocalAddr();  
                  Stringce = request.getCharacterEncoding();  
                  Stringgm = request.getMethod();  
                  Stringqs = request.getQueryString();  
       
                  System.out.println(uri);  
                  System.out.println(rad);  
                  System.out.println(rh);  
                  System.out.println(ru);  
                  System.out.println(rp);  
                  System.out.println(cp);  
                  System.out.println(la);  
                  System.out.println(ce);  
                  System.out.println(gm);  
                  System.out.println(qs);  


  即可获取相关信息。

2、通过request常用方法获得客户机请求头信息

  •   getHead(name)方法
  •   getHeaders(String name)方法
  •   getHeaderNames方法 

如:

[java] view plaincopy

    private void getRequestValue(HttpServletRequest request) {  
            //获得客户机请求头及请求头的值  
            System.out.println(request.getHeader("method"));  
            Enumeration e = request.getHeaderNames();  
            while(e.hasMoreElements()){  
                String name = (String)e.nextElement();  
                String value = request.getHeader(name);  
                System.out.println(name+":"+value);  
            }  
        }  




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

  •   getParameter(name):获取指定名称的参数值。这是最为常用的方法之一。
  •   getParameterValues(String name):获取指定名称参数的所有值数组。它适用于一个参数名对应多个值的情况。如页面表单中的复选框,多选列表提交的值。
  •   getParameterNames():返回一个包含请求消息中的所有参数名的Enumeration对象。通过遍历这个Enumeration对象,就可以获取请求消息中所有的参数名
  •   getParameterMap():返回一个保存了请求消息中的所有参数名和值的Map对象。Map对象的key是字符串类型的参数名,value是这个参数所对应的Object类型的值数组。

二、request的常见应用

1、 各种表单输入项数据的获取

如可以获取form表单中的text、password、radio、checkbox、 file、select、textarea、 hidden、image、button等组件的值进行数据库操作或其他处理操作。

来看一个具体应用:


界面代码主体部分如下:

 

[html] view plaincopy

     Register.html  
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01Transitional//EN">  
    <html>  
     <head>  
       <title>Register.html</title>  
            
        <metahttp-equivmetahttp-equiv="keywords"content="keyword1,keyword2,keyword3">  
        <metahttp-equivmetahttp-equiv="description" content="this is my page">  
       <meta http-equiv="content-type" content="text/html;charset=UTF-8">  
         
       <!--<link rel="stylesheet" type="text/css"href="./styles.css">-->  
       
     </head>  
       
     <body>  
     <form action ="RequestLogin" method ="post">  
        用户名:<input type="text"name = "username" ><br/>  
        密码:  <inputtypeinputtype="password" name = "password"><br/>  
      性别:<input type="radio"name = "sex" value ="male">男  
         <input type="radio" name = "sex" value="female">女<br/>  
      籍贯: <select name="city">  
           <option value ="HeBei">河北</option>  
           <opton value ="HuBei">湖北</opton>  
           <option value ="ShanXi">山西</option>  
         </select><br/>  
    简历:<br/>  
      &nsp;<textarea rows="5" cols="20" name="intro"></textarea>  
    <br/>  
    爱好:<br/>  
    <input type="checkbox" name="hobbies" value ="sing"/>唱歌  
    <input type="checkbox" name="hobbies" value ="dance"/>跳舞  
    <input type="checkbox" name="hobbies" value ="readbook"/>读书  
    <input type="checkbox" name="hobbies" value ="readnewspaper"/>看报<br/>  
    上传头像:<br/>  
    <input type="file" value="image" name ="browser"><br/>  
    <input type="submit" value="提交"/>  
     </form>  
       
     </body>  
    </html>  




[html] view plaincopy

     Register.html  
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01Transitional//EN">  
    <html>  
     <head>  
       <title>Register.html</title>  
            
        <metahttp-equivmetahttp-equiv="keywords"content="keyword1,keyword2,keyword3">  
        <metahttp-equivmetahttp-equiv="description" content="this is my page">  
       <meta http-equiv="content-type" content="text/html;charset=UTF-8">  
         
       <!--<link rel="stylesheet" type="text/css"href="./styles.css">-->  
       
     </head>  
       
     <body>  
     <form action ="RequestLogin" method ="post">  
        用户名:<input type="text"name = "username" ><br/>  
        密码:  <inputtypeinputtype="password" name = "password"><br/>  
      性别:<input type="radio"name = "sex" value ="male">男  
         <input type="radio" name = "sex" value="female">女<br/>  
      籍贯: <select name="city">  
           <option value ="HeBei">河北</option>  
           <opton value ="HuBei">湖北</opton>  
           <option value ="ShanXi">山西</option>  
         </select><br/>  
    简历:<br/>  
      &nsp;<textarea rows="5" cols="20" name="intro"></textarea>  
    <br/>  
    爱好:<br/>  
    <input type="checkbox" name="hobbies" value ="sing"/>唱歌  
    <input type="checkbox" name="hobbies" value ="dance"/>跳舞  
    <input type="checkbox" name="hobbies" value ="readbook"/>读书  
    <input type="checkbox" name="hobbies" value ="readnewspaper"/>看报<br/>  
    上传头像:<br/>  
    <input type="file" value="image" name ="browser"><br/>  
    <input type="submit" value="提交"/>  
     </form>  
       
     </body>  
    </html>  


然后,定义一个RequestLogin.java类通过request对象获取表单中组件的值:

如调用自定义方法:

[java] view plaincopy

    private void getInformation(HttpServletRequest request)  
    throws UnsupportedEncodingException {  
    //取出参数值   
    String name = request.getParameter("username");   
    String pass = request.getParameter("password");   
    String sex = request.getParameter("sex");   
    String city = request.getParameter("city");   
    String intro = request.getParameter("intro");   
    String [] hobbies = request.getParameterValues("hobbies");   
    String hobby ="";   
    //hobbies!=null对所取值为空时进行设置   
    for(int i=0;hobbies!=null&&i<hobbies.length;i++)  
    { String hovalue = hobbies[i]; hobby += hovalue; }   
    //获取头像信息 // String image = request.getParameter("image");   
    System.out.println("username:"+name);   
    System.out.println("password:"+pass);   
    System.out.println("sex:"+sex); System.out.println("city:"+city);   
    System.out.println("intro:"+intro); System.out.println("hobby:"+hobby);}  


即可获取表单中组件的值。

 

2、请求参数的中文乱码问题

前面我们提到了Response对象中出现乱码问题及相应的解决措施,那么在Request中如何解决编码问题呢?

下面来看具体的例子:

例如我想将一个form表单中的信息提取到并在控制台输出如图:

 

假设在服务端并未Request对象给指定编码时即服务器端接收请求的字符编码为ISO8859-1,这时你在客户端添加信息如:


当填入的信息有中文时,假设设置表单的提交方式为post方式提交

则在服务端输出如下:


此时输出结果出现乱码。

客户端主体代码同上:

  1. [html] view plaincopy
    
        Register.html  
          <body>  
          <form action ="RequestLogin" method ="post">  
            用户名:<input type="text" name = "username" ><br/>  
            密码:  <input type="password" name = "password"><br/>  
          性别:<input type="radio" name = "sex" value ="male">男  
              <input type="radio" name = "sex" value ="female">女<br/>  
          籍贯: <select name ="city">  
                <option value ="HeBei">河北</option>  
                <opton value ="HuBei">湖北</opton>  
                <option value ="ShanXi">山西</option>  
              </select><br/>  
        简历:<br/>  
           &nsp;<textarea rows="5" cols="20" name ="intro"></textarea>  
        <br/>  
        爱好:<br/>  
        <input type="checkbox" name ="hobbies" value ="sing"/>唱歌  
        <input type="checkbox" name ="hobbies" value ="dance"/>跳舞  
        <input type="checkbox" name ="hobbies" value ="readbook"/>读书  
        <input type="checkbox" name ="hobbies" value ="readnewspaper"/>看报<br/>  
        上传头像:<br/>  
        <input type="file" value ="image" name ="browser"><br/>  
        <input type="submit" value ="提交"/>  
          </form>  
          </body> 

     

服务端主体代码如下:

[
java] view plaincopy

    RequestLogin.java  
    package net.csdn.request;  
    import java.io.IOException;  
    import java.io.PrintWriter;  
    importjava.io.UnsupportedEncodingException;  
    import javax.servlet.ServletException;  
    import javax.servlet.http.HttpServlet;  
    importjavax.servlet.http.HttpServletRequest;  
    importjavax.servlet.http.HttpServletResponse;  
    public class RequestLogin extendsHttpServlet  
    {  
    public void doGet(HttpServletRequest request,HttpServletResponse response)  
    throws ServletException, IOException  
    {  
    getInformation(request);  
    }  
    private voidgetParameter(HttpServletRequest request)  
    throws UnsupportedEncodingException  
    {  
    private voidgetInformation(HttpServletRequest request)  
    throws UnsupportedEncodingException {  
    //取出参数值  
    String name =request.getParameter("username");  
    String pass =request.getParameter("password");  
    String sex =request.getParameter("sex");  
    String city =request.getParameter("city");  
    String intro = request.getParameter("intro");  
    String [] hobbies =request.getParameterValues("hobbies");  
    String hobby ="";  
    //hobbies!=null对所取值为空时进行设置  
    for(inti=0;hobbies!=null&&i<hobbies.length;i++)  
    { String hovalue = hobbies[i]; hobby +=hovalue; }  
    //获取头像信息 // String image = request.getParameter("image");  
    System.out.println("username:"+name);  
    System.out.println("password:"+pass);  
    System.out.println("sex:"+sex);System.out.println("city:"+city);  
    System.out.println("intro:"+intro);System.out.println("hobby:"+hobby);}  
    public void doPost(HttpServletRequestrequest, HttpServletResponse response)  
    throws ServletException, IOException{doGet(request, response);}}  

这里会出现乱码问题,是因为你在RegisterLogin.java中并没有给Request对象设置编码集,而Request对象的默认编码集是ISO8859-1是不支持汉字的,所以你只需要在此类中为其指明相应的编码即可:
改正:在doGet方法中加入如下代码指明接收请求的编码方式:
  request.setCharacterEncoding("utf-8");
即可输出:

但是这种修改方式只在提交方式为post时才有效。当提交方式为get时是不起作用的。
即;
<form action ="RequestLogin" method ="get">
时即便在

RequestLogin.java
中再设置
  request.setCharacterEncoding("utf-8");
也不会起任何作用了程序还会输出如图所示信息:


这时就需要在
RequestLogin.java
中含有中文的地方进行如下设置了即在doGet方法中加入如下代码:
  1. String username = new String(name.getBytes("iso8859-1"),"utf-8");  
  2.          String introduction = new String(intro.getBytes("iso8859-1"),"utf-8");  
  3.  System.out.println("username:"+username);  
  4.            System.out.println("password:"+introduction);  
此时再度测试时就OK了!如图

好了到这里,你大概已经知道该如何对Response和Request对象中的乱码问题进行操作了吧!

3、防盗链

      所谓的防盗链就是当你以一个非正常渠道去访问某一个Web资源的时候,服务器会将你的请求忽略并且将你的当前请求变为按正常渠道访问时的请求并返回到相应的页面,用户只有通过该页面中的相关操作去访问想要请求的最终资源。

        例如,你有一个访问某资源的网址,但是你事先不知道这个网址是有防盗链的,那么当你输入该网址时你可能会发现,并没有马上跳转到你想要的资源页面而是一些无关的信息页面,但是就是在这些信息页面中你发现有一个超链接或是其他操作可以跳转到你所访问的最终资源页面。

      这就是防盗链技术了,好了来看一个具体应用:

Rquest.java

[java] view plaincopy

    public class Request extends HttpServlet {  
    public void doGet(HttpServletRequest request, HttpServletResponse response)  
    throws ServletException, IOException {getDoorChain(request, response);}  
        private void getDoorChain(HttpServletRequest request,  
                HttpServletResponse response) throws IOException {  
    //通过request获取请求头参数         
     String referer = request.getHeader("referer");  
            if(referer==null || !referer.endsWith("http://localhost:8080/Request/index.jsp")){  
        response.sendRedirect("http://localhost:8080/Request/index.jsp");  
                return;  
            }  
            response.setCharacterEncoding("utf-8");  
            response.setContentType("text/html;charset =utf-8");  
            PrintWriter pw = response.getWriter();  
            pw.write("喜剧片《东成西就》");  
        }  
    public void doPost(HttpServletRequest request, HttpServletResponse response)  
                throws ServletException, IOException {  
            doGet(request, response);  
        }  
    }  



 index.jsp部分的主体代码:

  1. <body>  
  2.   这里是防盗链技术的应用检测! <br>  
  3.   <a href ="/Request/Request" >喜剧片 </a>  
  4.   </body>  
  5. </html>  

效果如图:


例如我最终想要通过http://lcoalhost:8080/Request/Request这个网址获取到我想要的《东成西就》
的资源可是当我真正的输入这个网址时,却转到了:
http://localhost:8080/Request/index.jsp这个页面

 

只有当你点击“喜剧片”这个超链接时才会真正的得到你想要的资源页面即:

 


好了赶快自己动手试一试吧!

4、request对象实现请求转发:

 Servlet API中定义了一个RequestDispatcher接口,俗称请求分派器。它定义了如下两个方法: public void forward(ServletRequest request, ServletResponseresponse) 、public void include(ServletRequest request,ServletResponse response) ,

获取RequestDispatcher实例的方式主要有两种:

  1.  调用ServletContext接口提供的getRequestDispatcher(Stringurl)方法。
  2. 调用ServletRequest接口提供的getRequestDispatcher(Stringurl)方法。

RequestDispatcher:

  被包含的Servlet程序不能改变响应消息的状态码和响应头,如果它里面存在这样的语句,这些语句的执行结果将被忽略。

 例:

request.getRequestDispatcher("./Welcome.jsp").forward(request,response);即可从当前应用跳转到相应的"./Welcome.jsp"页面。

request对象提供了一个getRequestDispatcher方法,该方法返回一个RequestDispatcher对象,调用这个对象的forward方法可以实现请求转发。 

request对象同时也是一个域对象,开发人员通过request对象在实现转发时,把数据通过request对象带给其它web资源处理。

可通过如下方法对request中的数据对象进行操作:

  • setAttribute方法 ;
  • getAttribute方法  ;
  • removeAttribute方法;
  • getAttributeNames方法;

三、关于请求转发的一些细节

  1. forward方法用于将请求转发到RequestDispatcher对象封装的资源。
  2. 如果在调用forward方法之前,在Servlet程序中写入的部分内容已经被真正地传送到了客户端,forward方法将抛出IllegalStateException异常。
  3. 如果在调用forward方法之前向Servlet引擎的缓冲区 (response)中写入了内容,只要写入到缓冲区中的内容还没有被真正输出到客户端,forward方法就可以被正常执行,原来写入到输出缓冲区中的 内容将被清空,但是,已写入到HttpServletResponse对象中的响应头字段信息保持有效。

四、请求重定向和请求转发的区别

    一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理,称之为请求转发。

   一个web资源收到客户端请求后,通知浏览器去访问另外一个web资源,称之为请求重定向。

注意:

  1. RequestDispatcher.forward方法只能将请求 转发给同一个WEB应用中的组件;而HttpServletResponse.sendRedirect方法还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源。 如果传递HttpServletResponse.sendRedirect方法的相对URL以“/”开头,它是相对于整个WEB站点的根目录;如果创建RequestDispatcher对象时指定的相对URL以“/”开头,它是相对于当前WEB应用程序的根目录。
  2. 调用HttpServletResponse.sendRedirect方法重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL 地址变成重定向的目标URL;调用RequestDispatcher.forward 方法的请求转发过程结束后,浏览器地址栏保持初始的URL地址不变。
  3. HttpServletResponse.sendRedirect 方法对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另外一个URL的访问请求;RequestDispatcher.forward方法在服务器端内部将请求转发给另外一个资源,浏览器只知道发出了请求并得到了响应结果,并不知道在服务器程序内部发生了转发行为。
  4. RequestDispatcher.forward方法的调用者与 被调用者之间共享相同的request对象和response对象,它们属于同一个访问请求和响应过程;而 HttpServletResponse.sendRedirect方法调用者与被调用者使用各自的request对象和response对象,它们属于 两个独立的访问请求和响应过程。

         关于请求消息头我们在以后的学习中还会经常用到request对象是我们目前在JavaWeb开发中学到的三个作用域即ServletContext、Request和Session域之一,是非常重要的一个请求对象,希望以上的相关介绍对能你有所帮助!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值