首页 > 代码库 > HttpServletRequest应用(第五次课)

HttpServletRequest应用(第五次课)

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

 

 

工程

 

 

 

 

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

 

 

  • getContextPath//项目根目录
  • getServletPath//是哪一个servlet
  • getSession().getServletContext().getRealPath("")
  • getSession().getServletContext().getRealPath("/abc");//得到工程目录,参数可具体到包名。
  • XXX.class.getResource("/").getPath();//访问servlet的具体绝对路径
  • getRequestURL方法返回客户端发出请求时的完整URL。
  • getRequestURI方法返回请求行中的资源名部分。
  • getQueryString 方法返回请求行中的参数部分。
  • getRemoteAddr方法返回发出请求的客户机的IP地址
  • getRemoteHost方法返回发出请求的客户机的完整主机名
  • getRemotePort方法返回客户机所使用的网络端口号
  • getLocalAddr方法返回WEB服务器的IP地址。
  • getLocalName方法返回WEB服务器的主机名
  • getMethod得到客户机请求方式

 

package lqy;import java.io.IOException;import javax.servlet.GenericServlet;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletRequest;public class requestTest extends GenericServlet {    @Override    public void service(ServletRequest arg0, ServletResponse arg1)            throws ServletException, IOException {        //这样获取HttpServletRequest类        HttpServletRequest request=(HttpServletRequest)arg0;        String ContextPath=request.getContextPath();//项目根目录        String ServletPath=request.getServletPath();//是哪一个servlet                   String RealPath=request.getSession().getServletContext().getRealPath("");//工程根目录绝对路径        String RealPath2=request.getSession().getServletContext().getRealPath("/abc");//得到工程目录,参数可具体到包名。                String RequestController=requestTest.class.getResource("/").getPath();//访问servlet的具体绝对路径                StringBuffer RequestURL=request.getRequestURL();//返回客户端发出请求时的完整URL        String QueryString=request.getQueryString();//方法返回请求行中的参数部分。        String RemoteAddr=request.getRemoteAddr();//方法返回发出请求的客户机的IP地址        String RemoteHost=request.getRemoteHost();//方法返回发出请求的客户机的完整主机名        int RemotePort=request.getRemotePort();//方法返回客户机所使用的网络端口号        String LocalAddr=request.getLocalAddr();//方法返回WEB服务器的IP地址。        String LocalName=request.getLocalName();//方法返回WEB服务器的主机名        String Method=request.getMethod();//得到客户机请求方式                System.out.println("调用ContextPath:"+ContextPath);                System.out.println("调用Servlet的部分:"+ServletPath);        System.out.println("调用RealPath:"+RealPath);        System.out.println("调用RealPath2:"+RealPath2);                    System.out.println("调用RequestController:"+RequestController);                  System.out.println("客户端发出请求时的完整URL:"+RequestURL);                System.out.println("方法返回请求行中的参数部分:"+QueryString);        System.out.println("方法返回发出请求的客户机的IP地址:"+RemoteAddr);        System.out.println("方法返回发出请求的客户机的完整主机名:"+RemoteHost);        System.out.println("方法返回客户机所使用的网络端口号:"+RemotePort);         System.out.println("方法返回WEB服务器的IP地址:"+LocalAddr);        System.out.println("方法返回WEB服务器的主机名:"+LocalName);        System.out.println("得到客户机请求方式:"+Method);     }    public requestTest() {        super();    }    public void destroy() {        super.destroy();     }    public void init() throws ServletException {    }}

 

输入url:http://localhost:8080/servlet_1/servlet/requestTest?id=2&name=luo

 

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

 

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

url发出请求:http://localhost:8080/servlet_1/servlet/requestTest?id=2&name=luo

 

	HttpServletRequest request=(HttpServletRequest)arg0;	//获得客户机请求头及请求头的值          String method=request.getHeader("method");        System.out.println("method:"+method);//key不存在就返回null        String Connection=request.getHeader("Connection");        System.out.println("Connection:"+Connection);        System.out.println("-----------------------");                //System.out.println(request.getHeader("getHeader:"+getHeader));          Enumeration e = request.getHeaderNames();  //该方法返回一个String对象的列表,该列表反映请求的所有头域名。        while(e.hasMoreElements()){              String name = (String)e.nextElement();              String value = http://www.mamicode.com/request.getHeader(name);  ":"+value);          } 

 

结果是如下,可以和上图的做对比

 

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

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

 

页面jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <base href="<%=basePath%>">        <title>demo</title>      <meta http-equiv="pragma" content="no-cache">    <meta http-equiv="cache-control" content="no-cache">    <meta http-equiv="expires" content="0">        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">    <meta http-equiv="description" content="This is my page">  </head>  <body>   <form action ="<%=basePath%>servlet/requestTest" method ="get">      用户名:<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>         <option value ="HuBei">湖北</opton>         <option value ="ShanXi">山西</option>       </select><br/>  简历:<br/>  <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>

 

java

package lqy;import java.io.IOException;import java.util.Enumeration;import java.util.Iterator;import java.util.Map;import java.util.Set;import javax.servlet.GenericServlet;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletRequest;public class requestTest extends GenericServlet {    @Override    public void service(ServletRequest arg0, ServletResponse arg1)            throws ServletException, IOException {                HttpServletRequest request=(HttpServletRequest)arg0;//      表单输入中文会发生乱码//      这里会出现乱码问题,是因为你在service并没有给Request对象设置编码集,//      而Request对象的默认编码集是ISO8859-1是不支持汉字的,所以你只需要在此类中为其指明相应的编码即可:       //      但是这种修改方式只在提交方式为post时才有效。当提交方式为get时是不起作用的。        request.setCharacterEncoding("utf-8");                //那么如果是get提交则      String username = new String(request.getParameter("username").getBytes("iso8859-1"),"utf-8");        System.out.println("处理后的"+username);      //那么如果是get提交则      String usernameWithout = request.getParameter("username");        System.out.println("未处理后的"+usernameWithout);                      System.out.println("---------------------getParameter-------getParameterValues-----------------");           //post取出参数值             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");//getParameterValues            //获取头像信息    ,只能获得文件名,不能获得绝对路径,现在很多浏览器从安全角度考虑,已经不能获取完整路径了(解决方法前端js获得绝对路径或者先上传到服务器再操作)          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);           for(String hobbie:hobbies){              System.out.println("hobbies:"+hobbie);          }          System.out.println("image:"+image);                                          System.out.println("---------------------getParameterNames------------------------");                                //getParameterNames          Enumeration e=request.getParameterNames();          while(e.hasMoreElements()){              String temp = (String)e.nextElement();              System.out.println("getParameterNames:"+temp);                                      }                                        System.out.println("--------------------getParameterMap-------------------------");                       Map map=request.getParameterMap();          Set set=map.keySet();          for(Object o: set){              String key=(String)o;              System.out.print("key:"+key+"-----value1:");                  // String[] value=http://www.mamicode.com/(String[])map.get(key);  //不能这样取              String[] valueArray=(String[])map.get(key);  //第一种 :要转换成String[]估计是为了getParameterValues的时候吧              for(String value1:valueArray){                  System.out.print(value1);                }              System.out.print("-----");              System.out.println("value2:"+request.getParameter(key)); //第二种              }                              System.out.println("--------------------getParameterMap2-------------------------");                       Map map2=request.getParameterMap();          Set set2=map.keySet();          for (Iterator iter = map2.entrySet().iterator(); iter.hasNext();)          {               Map.Entry entry = ( Map.Entry ) iter.next();              String key=entry.getKey().toString();              System.out.print("key:"+key+"-----value1:");                  String[] valueArray = ( String[] ) entry.getValue();              for(String value1:valueArray){                  System.out.print(value1);                }              System.out.print("-----");              System.out.println("value2:"+request.getParameter(key)); //第二种      }                       }    public requestTest() {        super();    }    public void destroy() {        super.destroy();     }    public void init() throws ServletException {    }}

结果

 

 

4、防盗链

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

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

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

 

HttpServletRequest应用(第五次课)