AndroidHttpClient使用Cookie应用分析

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

  下面是2个测试用的HttpServlet:

  复制代码 代码如下:

  public class LogIn extends HttpServlet {

  /**

  * Processes requests for both HTTP

  * and

  * 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();

  }

  }

  //

  /**

  * Handles the HTTP

  * 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

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

  }//

  }

  复制代码 代码如下:

  public class Info extends HttpServlet {

  /**

  * Processes requests for both HTTP

  * and

  * 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();

  }

  }

  //

  /**

  * Handles the HTTP

  * 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

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

  }//

  }

  主要代码在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 nvps = new ArrayList ();

  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和DefaultHttpClient的区别:

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

  您可能感兴趣的文章: