`

使用urlconnection和json发送post请求到服务器

阅读更多

客户端:

***
 *HttpURLConnection连接服务器<br>
 *<功能详细描述><br>
 *1、通过后台得到sessionID<br>
 *2、检查MAC地址是否正确<br>
 *3、处理从服务器读取的JSON对象<br>
 *4、从服务器读取对象<br>
 *5、得到对象输出流<br>
 *6、设置HttpURLConnection参数<br>
 *
 * @author "zhaohaiyang"<br>
 *@version 版本号 2010-1-14 下午02:01:41<br>
 *@see 相关类/方法<br>
 **/
public class ConUtils
{

 /**
  *通过后台得到sessionID<br>
  *<功能详细描述><br>
  *
  * @param parameters
  *            登陆信息
  * @return 登陆成功返回sessionId 失败返回“”
  * @see [类、类#方法、类#成员]
  */
 public static String receiveSessionID(String[] parameters, String[] values)
 {
  String tempSessionId = "";// SessionID

  URL url = null;// 请求处理的Servlet

  ObjectOutputStream objOutputStrm = null;// 对象输出流

  InputStream inStrm = null;// 得到HttpURLConnection的输入流

  HttpURLConnection httpUrlConnection = null;

  try
  {
   url = new URL("http://192.168.18.109:8080/jj_erp/loginval");

   // 设置HttpURLConnection参数
   httpUrlConnection = setURLConnectionProperties(url);

   // 得到对象输出流
   objOutputStrm = getObjOutStream(httpUrlConnection);

   JSONObject obj = new JSONObject();
   for (int i = 0; i < parameters.length; i++)
   {
    obj.put(parameters[i], values[i]);
   }
   // 向对象输出流写出数据,这些数据将存到内存缓冲区中
   objOutputStrm.writeObject(obj.toString());
   // 刷新对象输出流,将任何字节都写入潜在的流中(些处为ObjectOutputStream)
   objOutputStrm.flush();
   // 关闭流对象。此时,不能再向对象输出流写入任何数据,先前写入的数据存在于内存缓冲区中,
   // 在调用下边的getInputStream()函数时才把准备好的http请求正式发送到服务器
   // objOutputStrm.close();

   // 调用HttpURLConnection连接对象的getInputStream()函数,
   // 将内存缓冲区中封装好的完整的HTTP请求电文发送到服务端。
   inStrm = httpUrlConnection.getInputStream(); // <===注意,实际发送请求的代码段就在这里

   // 上边的httpConn.getInputStream()方法已调用,本次HTTP请求已结束,下边向对象输出流的输出已无意义,
   // 既使对象输出流没有调用close()方法,下边的操作也不会向对象输出流写入任何数据.
   // 因此,要重新发送数据时需要重新创建连接、重新设参数、重新创建流对象、重新写数据、
   // 重新发送数据(至于是否不用重新这些操作需要再研究)
   // objOutputStrm.writeObject(new String(""));
   // httpUrlConnection.getInputStream();

   // 从服务器读取对象
   Object inObj = readObjectFromServer(inStrm);
   // 处理从服务器读取的JSON对象
   tempSessionId = doJsonObjectFromServerForSesId(tempSessionId, inObj);
  }
  catch (MalformedURLException e)
  {
   e.printStackTrace();
  }
  catch (ProtocolException e)
  {
   e.printStackTrace();
  }
  catch (IOException e)
  {
   e.printStackTrace();
  }
  catch (JSONException e)
  {
   e.printStackTrace();
  }
  finally
  {
   try
   {
    if (objOutputStrm != null)
    {
     objOutputStrm.close();
    }
   }
   catch (IOException e)
   {
    e.printStackTrace();
   }
   try
   {
    if (inStrm != null)
    {
     inStrm.close();
    }
   }
   catch (IOException e)
   {
    e.printStackTrace();
   }
  }

  return tempSessionId;
 }

 /**
  *检查MAC地址是否正确<br>
  *
  * @param mac
  * @return MAC地址正确返回true 错误返回false
  *@see [类、类#方法、类#成员]
  */
 public static boolean checkMac(String mac)
 {

  URL url = null;// 请求处理的Servlet

  boolean flag = false;// MAC地址是否正确

  ObjectOutputStream objOutputStrm = null;// 对象输出流

  InputStream inStrm = null;// 得到HttpURLConnection的输入流

  HttpURLConnection httpUrlConnection = null;
  try
  {
   url = new URL("http://192.168.18.109:8080/jj_erp/checkMac");

   // 设置HttpURLConnection参数
   httpUrlConnection = setURLConnectionProperties(url);

   // 得到对象输出流
   objOutputStrm = getObjOutStream(httpUrlConnection);

   JSONObject obj = new JSONObject();
   obj.put("mac", mac);
   // 向对象输出流写出数据,这些数据将存到内存缓冲区中
   objOutputStrm.writeObject(obj.toString());
   // 刷新对象输出流,将任何字节都写入潜在的流中(些处为ObjectOutputStream)
   objOutputStrm.flush();
   // 关闭流对象。此时,不能再向对象输出流写入任何数据,先前写入的数据存在于内存缓冲区中,
   // 在调用下边的getInputStream()函数时才把准备好的http请求正式发送到服务器
   // objOutputStrm.close();

   // 调用HttpURLConnection连接对象的getInputStream()函数,
   // 将内存缓冲区中封装好的完整的HTTP请求电文发送到服务端。
   inStrm = httpUrlConnection.getInputStream(); // <===注意,实际发送请求的代码段就在这里

   // 上边的httpConn.getInputStream()方法已调用,本次HTTP请求已结束,下边向对象输出流的输出已无意义,
   // 既使对象输出流没有调用close()方法,下边的操作也不会向对象输出流写入任何数据.
   // 因此,要重新发送数据时需要重新创建连接、重新设参数、重新创建流对象、重新写数据、
   // 重新发送数据(至于是否不用重新这些操作需要再研究)
   // objOutputStrm.writeObject(new String(""));
   // httpUrlConnection.getInputStream();

   // 从服务器读取对象
   Object inObj = readObjectFromServer(inStrm);
   // 处理从服务器读取的JSON对象
   flag = doJsonObjectFromServer(flag, inObj);

  }
  catch (MalformedURLException e)
  {
   e.printStackTrace();
  }
  catch (IOException e)
  {
   e.printStackTrace();
  }
  catch (JSONException e)
  {
   e.printStackTrace();
  }
  finally
  {

  }

  return flag;
 }

 /**
  *处理从服务器读取的JSON对象 用于校验MAC地址<br>
  *<功能详细描述><br>
  *
  * @param flag
  *            MAC是否正确
  * @param inObj
  *            从服务器读到的JSON对象
  * @return MAC是否正确
  * @throws JSONException
  *@see [类、类#方法、类#成员]
  */

 private static boolean doJsonObjectFromServer(boolean flag, Object inObj)
   throws JSONException
 {
  // 做非空处理
  if (inObj != null)
  {
   // 根据得到的序列化对象 构建JSON对象
   JSONObject injson = new JSONObject(inObj.toString());
   // 拿到JSON对象中 对应key的值
   String getStr = injson.getString("returnstring");
   if (getStr.equals("true"))
   {
    flag = true;
   }
  }
  return flag;
 }

 private static String doJsonObjectFromServerForSesId(String tempSessionID,
   Object inObj) throws JSONException
 {
  // 做非空处理
  if (inObj != null)
  {
   // 根据得到的序列化对象 构建JSON对象
   JSONObject injson = new JSONObject(inObj.toString());
   // 拿到JSON对象中 对应key的值
   tempSessionID = injson.getString("sessionID");
  }
  return tempSessionID;
 }

 /**
  *从服务器读取对象<br>
  *<功能详细描述><br>
  *
  * @param inStrm
  *            输入流
  * @return 从服务器返回的对象
  * @throws IOException
  *@see [类、类#方法、类#成员]
  */

 private static Object readObjectFromServer(InputStream inStrm)
   throws IOException
 {
  ObjectInputStream objInStream; // 输入流 从服务器读取JSON对象
  objInStream = new ObjectInputStream(inStrm);// 输入流 从服务器读取JSON对象
  Object inObj = null;
  try
  {
   inObj = objInStream.readObject();// 读取对象
  }
  catch (ClassNotFoundException e)
  {
   e.printStackTrace();
  }
  return inObj;
 }

 /**
  *得到对象输出流<br>
  *<功能详细描述><br>
  *
  * @param httpUrlConnection
  *            后台与服务器之间的通信
  * @return 对象输出流
  * @throws IOException
  *@see [类、类#方法、类#成员]
  */

 private static ObjectOutputStream getObjOutStream(
   HttpURLConnection httpUrlConnection) throws IOException
 {
  OutputStream outStrm;// 得到HttpURLConnection的输出流
  ObjectOutputStream objOutputStrm;// 对象输出流
  // 此处getOutputStream会隐含的进行connect(即:如同调用上面的connect()方法,
  // 所以在开发中不调用上述的connect()也可以)。
  outStrm = httpUrlConnection.getOutputStream();

  // 现在通过输出流对象构建对象输出流对象,以实现输出可序列化的对象。
  // 使用JSON传值
  objOutputStrm = new ObjectOutputStream(outStrm);
  return objOutputStrm;
 }

 /**
  *设置HttpURLConnection参数<br>
  *<功能详细描述><br>
  *
  * @param url
  *            请求处理的地址
  * @return 后台与服务器之间的通信连接
  * @throws IOException
  * @throws ProtocolException
  *@see [类、类#方法、类#成员]
  */

 private static HttpURLConnection setURLConnectionProperties(URL url)
   throws IOException, ProtocolException
 {
  HttpURLConnection httpUrlConnection;
  URLConnection rulConnection = url.openConnection();// 此处的urlConnection对象实际上是根据URL的
  // 请求协议(此处是http)生成的URLConnection类
  // 的子类HttpURLConnection,故此处最好将其转化
  // 为HttpURLConnection类型的对象,以便用到
  // HttpURLConnection更多的API.如下:

  httpUrlConnection = (HttpURLConnection) rulConnection;

  // 设置是否向httpUrlConnection输出,因为这个是post请求,参数要放在
  // http正文内,因此需要设为true, 默认情况下是false;
  httpUrlConnection.setDoOutput(true);

  // 设置是否从httpUrlConnection读入,默认情况下是true;
  httpUrlConnection.setDoInput(true);

  // Post 请求不能使用缓存
  httpUrlConnection.setUseCaches(false);

  // 设定传送的内容类型是可序列化的java对象
  // (如果不设此项,在传送序列化对象时,当WEB服务默认的不是这种类型时可能抛java.io.EOFException)
  // httpUrlConnection.setRequestProperty("Content-type",
  // "application/x-java-serialized-object");
  //   
  httpUrlConnection
    .setRequestProperty("Content-type", "application/json");

  // 设定请求的方法为"POST",默认是GET
  httpUrlConnection.setRequestMethod("POST");

  try
  {
   // 连接,从上述至此的配置必须要在connect之前完成,
   httpUrlConnection.connect();
   httpUrlConnection.setConnectTimeout(1);
   httpUrlConnection.setReadTimeout(1);
  }
  catch (ConnectException e1)
  {
   if (e1.getMessage().equals("Connection refused: connect"))
   {
    JOptionPane.showMessageDialog(null, "连接超时");
    System.exit(0);
   }
  }
  return httpUrlConnection;
 }

 public static void main(String[] args)
 {
  if (checkMac("40-61-86-69-82-E2"))
  {
   System.out.println("mac地址校验成功");
  }
  else
  {
   System.out.println("mac地址校验失败");
  }
 }
}

 

服务器端:

checkMac.java

      public class CheckMac extends HttpServlet
{
 private static final long serialVersionUID = 1L;
 private String    returnstring  = "false";

 @Override
 protected void doPost(HttpServletRequest req, HttpServletResponse resp)
   throws ServletException, IOException
 {
  InputStream inStream = req.getInputStream();
  ObjectInputStream objInStream = new ObjectInputStream(inStream);
  Object obj = null;
  try
  {
   obj = objInStream.readObject();
  }
  catch (ClassNotFoundException e1)
  {
   e1.printStackTrace();
  }
  JSONObject json = null;
  String mac = "";
  JSONObject outjson = new JSONObject();
  try
  {
   if (obj != null)
   {
    json = new JSONObject(obj.toString());
    mac = json.getString("mac");

    if (mac.equals("40-61-86-69-82-E2"))
    {
     returnstring = "true";
    }
   }
  }
  catch (JSONException e)
  {
   e.printStackTrace();
  }
  try
  {
   outjson.put("returnstring", returnstring);
  }
  catch (JSONException e)
  {
   e.printStackTrace();
  }
  resp.setContentType("text/html;charset=utf-8");
  OutputStream out = resp.getOutputStream();
  ObjectOutputStream objOutputStrm = new ObjectOutputStream(out);
  objOutputStrm.writeObject(outjson.toString());
  objOutputStrm.flush();
  objOutputStrm.close();
 }

 

LoginValidate.java

private String    dept    = ""; // 部门
 private String    name    = ""; // 姓名
 private String    pass    = ""; // 密码
 private String    mac     = ""; // MAC地址
 private String    ip     = ""; // IP地址
 private String    sessionID   = "";

 @Override
 protected void doPost(HttpServletRequest req, HttpServletResponse resp)
   throws ServletException, IOException
 {
  InputStream inStream = req.getInputStream();
  ObjectInputStream objInStream = new ObjectInputStream(inStream);
  Object obj = null;
  try
  {
   obj = objInStream.readObject();
  }
  catch (ClassNotFoundException e1)
  {
   e1.printStackTrace();
  }
  JSONObject json = null;
  JSONObject outjson = new JSONObject();
  try
  {
   if (obj != null)
   {
    json = new JSONObject(obj.toString());
    if (json != null)
    {
     dept = json.getString("dept");
     name = json.getString("name");
     pass = json.getString("pass");
     mac = json.getString("mac");
     ip = json.getString("ip");
    }
   }
  }
  catch (JSONException e)
  {
   e.printStackTrace();
  }

  /**
   * 判断登陆信息 登陆成功创建Session
   */
  if (validateInfo())
  {
//   HttpSession session = req.getSession(true);
//   sessionID = session.getId();
   sessionID = "sessionid";
  }
  // 把sessionID放入JSON中
  try
  {
   outjson.put("sessionID", sessionID);
  }
  catch (JSONException e)
  {
   e.printStackTrace();
  }

  // 将sessionID以JSON方式发送到客户端
  resp.setContentType("text/html;charset=utf-8");
  OutputStream out = resp.getOutputStream();
  ObjectOutputStream objOutputStrm = new ObjectOutputStream(out);
  objOutputStrm.writeObject(outjson.toString());
  objOutputStrm.flush();
  objOutputStrm.close();
 }

 /**
  *校验登陆信息是否正确<br>
  *<功能详细描述><br>
  *
  * @return 正确返回true 否则返回false
  *@see [类、类#方法、类#成员]
  */

 private boolean validateInfo()
 {
  return true;
 }

分享到:
评论

相关推荐

    通过java.net.URLConnection发送HTTP请求

    这个例子展示了如何使用URLConnection发送POST请求,并读取服务器的响应。注意,实际使用时,你需要将URL替换为你需要请求的实际服务器地址,同时根据需要修改请求头和请求体的内容。 通过这个示例,我们可以了解到...

    IOS 程序使用urlconnection连接服务器方法

    ### IOS程序使用URLConnection连接服务器方法 #### 一、引言 在iOS开发中,应用程序往往需要与后端服务器进行通信来获取数据或提交用户操作的结果。`NSURLConnection`(现已被`URLSession`替代)是一种常用的网络...

    Android客户端与服务器端的json数据交互(内含大量知识点)

    可以使用`java.net.URLConnection`或者第三方库如OkHttp、Retrofit来发送POST请求。 - 在请求体中,文件通常以多部分形式(Multipart Form Data)提交。`RequestBody.create(MediaType.parse("image/*"), file)`...

    JAVA NET 发送HTTP请求

    2. `sendPost(String url, Map, String&gt; params)`: POST请求通常用于传递大量数据或敏感信息,如登录凭据。数据被放在请求体中,可以通过setDoOutput(true)开启输出流,并使用DataOutputStream写入。 在发送HTTP...

    java URLConnection总结(经典易懂)

    通过以上总结,你可以更好地理解如何使用Java URLConnection进行网络通信,包括发送GET和POST请求,以及处理登录和其他需要发送数据的情况。在实际项目中,结合具体的业务需求,这些知识将有助于实现高效且安全的...

    https网络请求,包含get和post形式

    而POST请求则用于向服务器发送数据,参数在请求体中,可以传输更多数据且相对隐蔽。 在Java中实现HTTPS网络请求,我们需要以下几个步骤: 1. **导入相关库**:Java的HttpURLConnection类是处理HTTP请求的标准API,...

    使用UrlConnection实现后台模拟http请求的简单实例

    本实例将详细解释如何使用`UrlConnection`来实现这一功能,包括设置请求头、发送POST数据以及处理响应。 首先,我们需要创建一个HTTP连接。在示例代码中,我们首先构建了一个URL对象,并通过`openConnection()`方法...

    java http post client server

    服务器的主要职责是接收客户端的POST请求,处理请求体中的数据,并返回响应。 服务器端实现的关键步骤包括: 1. 创建`HttpServer`实例:通过`HttpServer.create(new InetSocketAddress(port), 0)`方法创建服务器...

    Acme包中的以Post方式发送数据的例子.doc

    `doInput`和`doOutput`布尔变量分别表示是否允许输入流和输出流,对于POST请求,`doOutput`通常设置为`true`,因为需要向服务器发送数据。`useCaches`变量控制是否使用缓存,这里设置为`false`以避免使用缓存。 `...

    java 用HttpsURLConnection进行传递中文时错误总结

    本篇文章将深入探讨如何使用`HttpsURLConnection`来正确地发送和接收含有中文字符的信息。我们将讨论可能遇到的错误、原因以及解决方法。 首先,`HttpsURLConnection`是Java提供的一个类,用于通过HTTPS协议进行...

    Android Studio调用RestfulWCF接口

    然后,使用 URL 和 HttpURLConnection 对象来发送 POST 请求,设置请求头和请求体,并将 JSON 对象转换为 byte 数组并写入输出流中。最后,获取响应代码,以确定请求是否成功。 需要注意的是,在 Android 中,网络...

    从服务器获取数据,上传数据

    在Android客户端开发中,从服务器获取数据和上传数据是核心功能之一,这涉及到网络编程、数据解析、异步处理等多个技术领域。以下是对这些知识点的详细说明: 1. **网络编程**:Android客户端与服务器之间的通信...

    谈谈Java利用原始HttpURLConnection发送POST数据

    总的来说,使用Java的`HttpURLConnection`发送POST请求涉及了URL和HTTP连接的管理,请求头的设置,以及数据的编码与传输。这种方法虽然相对基础,但足够灵活,适用于大部分简单的HTTP通信需求。然而,在处理复杂的...

    Android中使用HttpURLConnection实现GET POST JSON数据与下载图片

    POST请求常用于向服务器发送数据,如登录、注册等场景。以下是一个使用HttpURLConnection进行POST提交JSON数据的示例: ```java public boolean postJsonData(String jsonString) { OutputStream outputStream = ...

    Java发送https请求代码实例

    在Java中发送HTTPS请求需要使用`HttpsURLConnection`类,该类继承自`URLConnection`类,是专门用于HTTPS请求的类。`HttpsURLConnection`类提供了多种方法来发送HTTPS请求,例如设置请求方法、设置请求头、设置请求体...

    Android HTTP 客户端编程.pdf

    本节主要讨论如何在Android平台上实现HTTP通信,特别是使用HttpUrlConnection接口来发送GET和POST请求。 Android的HTTP客户端编程主要涉及到以下几个核心概念: 1. **HTTP协议**:超文本传输协议(HTTP)是一种...

    远程连接服务器HttpURLConnection

    在上传文件到远程服务器时,我们通常使用POST请求,并通过`OutputStream`写入文件数据。例如,将一个名为"file.txt"的文件上传: ```java try (BufferedInputStream in = new BufferedInputStream(new ...

    安卓和客户端http通信demo

    这个Demo可能涵盖了从创建HTTP请求,到发送请求,接收服务器响应,解析数据,以及处理可能出现的错误等一系列步骤。学习这个Demo可以帮助开发者理解Android客户端如何与服务器进行有效的数据通信,为实际项目开发...

    java.net.URL测试代码

    发送数据到服务器可以使用`URLConnection`的`getOutputStream()`方法,如下所示: ```java try(OutputStream out = connection.getOutputStream()) { out.write(jsonData.getBytes(StandardCharsets.UTF_8)); } ```...

Global site tag (gtag.js) - Google Analytics