博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AndroidHttpClient使用Cookie
阅读量:5888 次
发布时间:2019-06-19

本文共 7326 字,大约阅读时间需要 24 分钟。

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

 

下面是2个测试用的HttpServlet:

public class LogIn extends HttpServlet {    /**     * Processes requests for both HTTP     * GET and     * POST 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 *
GET 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 *
POST 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     * GET and     * POST 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 *
GET 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 *
POST 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不然不能创建新实例。

posted on
2012-11-26 20:16 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/kagami/archive/2012/11/26/2789691.html

你可能感兴趣的文章
JQuery UI的拖拽功能
查看>>
数据驱动销售——个性化推荐引擎
查看>>
C语言标准库函数qsort那点小事
查看>>
HL7 CDA高级培训
查看>>
Android 调用照相机拍照
查看>>
linux的C获取shell执行返回的结果
查看>>
关于spring mybateis 定义resultType="java.util.HashMap"
查看>>
程序员怎么留住健康?
查看>>
(转)C# 把我所积累的类库全部分享给博友(附件已经上传)
查看>>
Silverlight5 无法切换输入法,无法输入中文的原因及解决初探
查看>>
游戏开发基础:方向键的组合,八方向实现
查看>>
黑书-DP-方块消除 ****
查看>>
MySQL 分区
查看>>
我的架构经验系列文章 - 后端架构 - 语言层面
查看>>
DEFERRED_SEGMENT_CREATION
查看>>
读取手机硬件信息
查看>>
一致哈希
查看>>
The connection to adb is down, and a severe error has occured. 问题解决
查看>>
在Jenkins中配置运行远程shell命令
查看>>
代码杂记
查看>>