AndroidHttpClient 사용 쿠키 응용 분석

8257 단어 androidcookie
오늘 은 HttpClient 를 사용 한 자동 출석 애플 릿 을 Android 에 이식 하려 고 합 니 다.다행히 Android SDK 는 HttpClient 가방 을 가지 고 있 습 니 다.안 드 로 이 드 문 서 를 뒤 졌 을 때 공식 적 으로 HttpClient 인 터 페 이 스 를 실현 한 AndroidHttpClient 를 제 공 했 는데 인터넷 에서 AndroidHttpClient 에 관 한 글 을 찾 아 보 았 지만 발견 되 지 않 았 다.물론 DefaultHttpClient 를 계속 사용 할 수도 있 지만,Android 를 위 한 맞 춤 형 AndroidHttpClient 를 사용 하 는 것 이 자 연 스 럽 습 니 다.다음은 테스트 용 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 을 찾 는 쿠키 를 얻 을 수 있 습 니 다.그리고 Info 를 방문 하면 쿠키 가 있 으 면 서버 에서 방금 전 달 된 값 을 찾 아 되 돌려 줄 수 있 습 니 다.쿠키 가 없 으 면 찾 을 수 없습니다.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 는 정적 방법 인 new Instance 를 통 해 인 스 턴 스 를 얻 습 니 다.인 자 는 에이전트 이 고 프 록 시 를 사용 하지 않 으 면""을 작성 합 니 다.DefaultHttpClient 는 기본적으로 Cookie 를 사용 합 니 다.AndroidHttpClient 는 기본적으로 Cookie 를 사용 하지 않 습 니 다.사용 하려 면 execute 를 사용 할 때마다 HttpContext 인 자 를 추가 하고 CookieStore 를 추가 해 야 합 니 다.다 쓴 후에 close 를 잊 지 마 세 요.그렇지 않 으 면 새로운 인 스 턴 스 를 만 들 수 없습니다.

좋은 웹페이지 즐겨찾기