`

使用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;
 }

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics