zoukankan      html  css  js  c++  java
  • 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
         * <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和DefaultHttpClient的区别:

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

  • 相关阅读:
    超强视频分割/剪辑软件:Ultra Video Splitter绿色便携版
    PAZU 4Fang WEB 打印控件
    PHP开源网站
    jQuery实现点击小图显示大图效果
    博观而约取,厚积而薄发
    jquery两边飘浮的对联广告
    图片或文字循环滚动JS代码收集
    降低站长成本 推荐8个免费或低廉小型建站工具
    市净率
    浅谈策略交易、系统交易和程式交易
  • 原文地址:https://www.cnblogs.com/kagami/p/2789691.html
Copyright © 2011-2022 走看看