服务端验证码解决方法。
在服务端生成验证码后会把验证码字符串存在服务端的session中,等待用户提交进行比对。为了保证服务器与客户端的一对一的关系,所以出现了session 和cookie技术。客户端的cookie 存放的是服务端session 的key值。
(1)在取得服务端验证码图片时,同时取得Cookie,从Cookie中取得JSESSIONID(服务端是用java开发)的值,将其放到一个全局静态变量中。
(2)提交内容时一起把JSESSIONID的值传过去。
(3)如果服务器端提示验证码错误时,就在此线程中再开辟一个线程重新获取验证码图片。
从服务端取得图片:
HttpGet get=new HttpGet("http://www.qd-n-tax.gov.cn/sst/getVCI"); DefaultHttpClient client=new DefaultHttpClient(); HttpResponse response=client.execute(get); if(response.getStatusLine().getStatusCode()==HttpStatus.SC_OK){ HttpEntity entity=response.getEntity(); InputStream is=entity.getContent(); bitmap=BitmapFactory.decodeStream(is); is.close(); }
从服务端取得cookie:
//得到服务端Cookie List<Cookie>cookies=client.getCookieStore().getCookies(); for(int i=0;i<cookies.size();i++){ //取得Cookie['JSESSIONID']的值存在静态变量中 if("JSESSIONID".equals(cookies.get(i).getName())){ TsjbActivity.JSESSIONID=cookies.get(i).getValue(); break; } }
将session id返回个服务器,保证服务器与客户端一对一:
HttpPost post=new HttpPost(path); post.setEntity(new UrlEncodedFormEntity(list,HTTP.UTF_8)); if(null!=TsjbActivity.JSESSIONID){ //为了与服务端的session交互,将SESSIONID发给服务器 post.setHeader("Cookie", "JSESSIONID="+TsjbActivity.JSESSIONID); } HttpResponse response=new DefaultHttpClient().execute(post);