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

来源:互联网 发布:无标度网络应用 编辑:程序博客网 时间:2024/04/25 17:42
2010-02-22 13:02

客户端:

***
*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;
}


原创粉丝点击