手机
当前位置:查字典教程网 >编程开发 >Java >AndroidHttpClient使用Cookie应用分析
AndroidHttpClient使用Cookie应用分析
摘要:今天想把一个用使用了HttpClient的自动签到小程序移植到Android上,还好Android的SDK自带了HttpClient的包。翻...

今天想把一个用使用了HttpClient的自动签到小程序移植到Android上,还好Android的SDK自带了HttpClient的包。翻Android的文档时发现官方还提供了一个实现了HttpClient接口的AndroidHttpClient,上网搜了下没发现关于AndroidHttpClient的文章。当然也可以继续使用DefaultHttpClient,但用为Android定制的AndroidHttpClient自然更好。

下面是2个测试用的HttpServlet:

复制代码 代码如下:

public class LogIn extends HttpServlet {

/**

* Processes requests for both HTTP

* <code>GET</code> and

* <code>POST</code> methods.

*

* @param request servlet request

* @param response servlet response

* @throws ServletException if a servlet-specific error occurs

* @throws IOException if an I/O error occurs

*/

protected void processRequest(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

response.setContentType("text/html;charset=UTF-8");

request.setCharacterEncoding("utf-8");

PrintWriter out = response.getWriter();

HttpSession session=request.getSession();

String info=request.getParameter("info");

session.setAttribute("info", info);

try {

/* TODO output your page here. You may use following sample code. */

out.println("OK");

} finally {

out.close();

}

}

// <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">

/**

* Handles the HTTP

* <code>GET</code> method.

*

* @param request servlet request

* @param response servlet response

* @throws ServletException if a servlet-specific error occurs

* @throws IOException if an I/O error occurs

*/

@Override

protected void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

processRequest(request, response);

}

/**

* Handles the HTTP

* <code>POST</code> method.

*

* @param request servlet request

* @param response servlet response

* @throws ServletException if a servlet-specific error occurs

* @throws IOException if an I/O error occurs

*/

@Override

protected void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

processRequest(request, response);

}

/**

* Returns a short description of the servlet.

*

* @return a String containing servlet description

*/

@Override

public String getServletInfo() {

return "Short description";

}// </editor-fold>

}

复制代码 代码如下:

public class Info extends HttpServlet {

/**

* Processes requests for both HTTP

* <code>GET</code> and

* <code>POST</code> methods.

*

* @param request servlet request

* @param response servlet response

* @throws ServletException if a servlet-specific error occurs

* @throws IOException if an I/O error occurs

*/

protected void processRequest(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

response.setContentType("text/html;charset=UTF-8");

PrintWriter out = response.getWriter();

HttpSession session=request.getSession();

String info=(String)session.getAttribute("info");

try {

/* TODO output your page here. You may use following sample code. */

if(info==null)

out.print("null");

else

out.print(info);

} finally {

out.close();

}

}

// <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">

/**

* Handles the HTTP

* <code>GET</code> method.

*

* @param request servlet request

* @param response servlet response

* @throws ServletException if a servlet-specific error occurs

* @throws IOException if an I/O error occurs

*/

@Override

protected void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

processRequest(request, response);

}

/**

* Handles the HTTP

* <code>POST</code> method.

*

* @param request servlet request

* @param response servlet response

* @throws ServletException if a servlet-specific error occurs

* @throws IOException if an I/O error occurs

*/

@Override

protected void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

processRequest(request, response);

}

/**

* Returns a short description of the servlet.

*

* @return a String containing servlet description

*/

@Override

public String getServletInfo() {

return "Short description";

}// </editor-fold>

}

主要代码在processRequest里,其他可以不用看。

访问LogIn时传一个name为info的值,这时浏览器会得到一个用于定位服务端session的cookie。然后访问Info,如果有cookie的话服务端能找到刚才你传的值并返回给你,没带cookie的话就不能找到。

Android端代码:

复制代码 代码如下:

public class MainActivity extends Activity {

private AndroidHttpClient mHttpclient=AndroidHttpClient.newInstance("");

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

findViewById(R.id.button1).setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

new Thread(rTest).start();

}

});

}

private String toString(InputStream is) throws IOException{

String ret="";

InputStreamReader isr=new InputStreamReader(is);

BufferedReader br=new BufferedReader(isr);

String tmp=br.readLine();

while(tmp!=null){

ret+=tmp;

tmp=br.readLine();

}

br.close();

return ret;

}

private Runnable rTest=new Runnable() {

@Override

public void run() {

// TODO Auto-generated method stub

try {

BasicHttpContext context=new BasicHttpContext();

context.setAttribute(ClientContext.COOKIE_STORE,new BasicCookieStore());

HttpPost httppost = new HttpPost("http://10.226.233.48:8080/WebApplication1/LogIn");

List <NameValuePair> nvps = new ArrayList <NameValuePair>();

nvps.add(new BasicNameValuePair("info", "你好 世界!!"));

httppost.setEntity(new UrlEncodedFormEntity(nvps,"utf-8"));

HttpResponse response=mHttpclient.execute(httppost,context);

HttpEntity entity = response.getEntity();

Log.i("kagami", MainActivity.this.toString(entity.getContent()));

entity.consumeContent();

HttpGet httpget2 = new HttpGet("http://10.226.233.48:8080/WebApplication1/Info");

HttpResponse response2=mHttpclient.execute(httpget2,context);

HttpEntity entity2 = response2.getEntity();

Log.i("kagami", MainActivity.this.toString(entity2.getContent()));

entity2.consumeContent();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

};

AndroidHttpClient使用Cookie应用分析1

AndroidHttpClient和DefaultHttpClient的区别:

AndroidHttpClient不能在主线程中execute,会抛出异常。AndroidHttpClient通过静态方法newInstance获得实例,参数是代理,不用代理的话填“”。DefaultHttpClient默认是启用Cookie的,AndroidHttpClient默认不启用Cookie,要使用的话每次execute时要加一个HttpContext参数,并且添加CookieStore。用完后别忘了close不然不能创建新实例。

【AndroidHttpClient使用Cookie应用分析】相关文章:

java_String和StringBuffer区别分析

基于指针pointers和引用references的区别分析

Java递归算法的使用分析

java中instanceof和getClass()的区别分析

java中break和continue区别及使用场合分析

Java overload和override的区别分析

基于Java回顾之网络通信的应用分析

Java中CyclicBarrier的用法分析

基于HttpServletResponse 相关常用方法的应用

log4j的使用详细解析

精品推荐
分类导航