addison_lin 发表于 2012-1-18 14:17:47

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

1、通过后台得到sessionID<br>
2、检查MAC地址是否正确<br>
3、处理从服务器读取的JSON对象<br>
4、从服务器读取对象<br>
5、得到对象输出流<br>
6、设置HttpURLConnection参数<br>

客户端:
***
*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, values);
}
// 向对象输出流写出数据,这些数据将存到内存缓冲区中
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;
}
页: [1]
查看完整版本: 使用urlconnection和json发送post请求到服务器