05.18 안드로이드 서버 통신 - 로그인 기능

최고고·2022년 5월 18일
1

서버에서 세션 정보 가져오기

  • 안드로이드는 세션이 없기 때문에 서버에서 세션 정보를 가져와야됨
  • 서버에서 안드로이드로 JSON 타입으로 가져옴

스프링에서 로그인 기능을 구현해놨기 땜에 로그인 성공 기능은 만들지않고 안드로이드와 통신할 수 있는 메소드를 만들어줌

  • android에서 로그인 요청시 로그인에 성공하게 되면 MemberVO를 Json형태로 변환해서 돌려주는 메소드
  • 리턴타입 앞에 @ResponseBody --> Json으로 응답해줌

Login java파일

  • RequestQueue, url 객체 만듦
  • 응답 데이터 받아오는 곳
    Log.v("resultValue",response); 로그캣에서 응답받은 JSON 데이터 확인하고
    Log.v("resultValue", response.length()+""); 응답글자 수 보여짐-> 글자수가 0일때 응답객체의 글자수가 없어서 로인실패라는 것을 알 수 있다.
  • 로그인 실패시 토스트메시지 띄워줌
  • try~catch 예외처리 해야됨 -> 응답데이터가 Json타입이 아닐 수 있기 때문

json 받아와 변수에 담아주고 MemberVO타입으로 담아줌

  • Intent 객체 생성해 화면 이동
    intent에 "vo"이름으로 vo 담아 데이터 이동시킴
    startActivity(intent);
package com.example.ex220516;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.android.volley.AuthFailureError;
import com.android.volley.NetworkResponse;
import com.android.volley.ParseError;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.HttpHeaderParser;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;

public class Login extends AppCompatActivity {
    private Button btn_login;
    private EditText edt_login_id,edt_login_pw;
    private RequestQueue requestQueue;
    private StringRequest stringRequest;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        btn_login = findViewById(R.id.btn_login);
        edt_login_id = findViewById(R.id.edt_login_id);
        edt_login_pw = findViewById(R.id.edt_login_pw);
        btn_login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sendRequest();

            }
        });
    }

    public void sendRequest() {
        //RequestQueue 객체 생성
        requestQueue = Volley.newRequestQueue(this);    // this==getApplicationContext();

        // 서버에 요청할 주소
        String url = "http://172.30.1.24:8082/web/andLogin.do";

        // 1.객체만들고 요청 주소만듦

        // 요청시 필요한 문자열 객체 생성  매개변수  4개(통신방식(get,post),요청url주소, new 리스너(익명클래스)-응답시필요한부분 작성함)
        stringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>(){
            // 응답데이터를 받아오는 곳
            // 응답시 데이터 받아오는 곳 - 통신이 잘됐다면 로그캣에서 확인하게출력함
            @Override
            public void onResponse(String response) {
                Log.v("resultValue",response);
                Log.v("resultValue", response.length()+"");         //응답글자 수 보여짐,
                if(response.length() > 0) {
                    //로그인 성공 0은 로그인실패
                    try {
                        JSONObject jsonObject = new JSONObject(response);   //response가 JSON타입이 아닐 수 있어서 예외처리 해주기
                        String id = jsonObject.getString("id");
                        String pw = jsonObject.getString("pw");
                        String nick = jsonObject.getString("nick");
                        String phone = jsonObject.getString("phone");
                        Log.v("resultValue",id+"/"+pw+"/"+nick+"/"+phone);

                        //로그인 성공시 LoginSuccess 로 이동,
                        // MemberVO 만들어서 넘기기
                        MemberVO vo = new MemberVO(id,pw,nick,phone);
                        Intent intent = new Intent(getApplicationContext(),LoginSuccess.class);
                        intent.putExtra("vo",vo);
                        startActivity(intent);



                    } catch (JSONException e) {
                        e.printStackTrace();
                    }

                }else {
                    //로그인실패
                    Toast.makeText(Login.this, "로그인실패", Toast.LENGTH_SHORT).show();
                }

            }
        }, new Response.ErrorListener() {
            // 서버와의 연동 에러시 출력
            @Override
            public void onErrorResponse(VolleyError error) {
                error.printStackTrace();
            }
        }){
            @Override //response를 UTF8로 변경해주는 소스코드
            protected Response<String> parseNetworkResponse(NetworkResponse response) {
                try {
                    String utf8String = new String(response.data, "UTF-8");
                    return Response.success(utf8String, HttpHeaderParser.parseCacheHeaders(response));
                } catch (UnsupportedEncodingException e) {
                    // log error
                    return Response.error(new ParseError(e));
                } catch (Exception e) {
                    // log error
                    return Response.error(new ParseError(e));
                }
            }

            // 보낼 데이터를 저장하는 곳 해쉬맵에 저장해서 보냄 - key,value
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                Map<String, String> params = new HashMap<>();
                String id = edt_login_id.getText().toString();
                String pw = edt_login_pw.getText().toString();


                params.put("id", id);
                params.put("pw",pw);
                // key값은 서버에서 지정한 name과 동일하게

                return params;
            }
        };
        stringRequest.setTag("main");       //구분자 어떤클라이언트에서 요청했는지 나타냄 (중요하지않음)
        requestQueue.add(stringRequest);        //실행 요청 add에 담으면 자동요청
    }
}

MemverVO 클래스 - 직렬화해야됨

이동된 화면 LoginSuccess.xml

LoginSuccess.java

  • Serializable 타입으로 받아왔기 땜에 VO타입으로 다운캐스팅
package com.example.ex220516;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;

import org.w3c.dom.Text;

public class LoginSuccess extends AppCompatActivity {
    private TextView tv_login_id,tv_login_pw,tv_login_nick,tv_login_phone;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login_success);
        tv_login_id = findViewById(R.id.tv_login_id);
        tv_login_pw = findViewById(R.id.tv_login_pw);
        tv_login_nick = findViewById(R.id.tv_login_nick);
        tv_login_phone = findViewById(R.id.tv_login_phone);

        Intent intent = getIntent();
        MemberVO vo = (MemberVO) intent.getSerializableExtra("vo");

        tv_login_id.setText(vo.getId());
        tv_login_pw.setText(vo.getPw());
        tv_login_nick.setText(vo.getNick());
        tv_login_phone.setText(vo.getPhone());

    }
}



세션처럼 로그인 정보를 계속 저장할 변수 만들기

  • 자바 클래스 생성
    클래스이름 - LoginCheck
    클래스내 필드 선언 public static
package com.example.ex220516;

public class LoginCheck {
    //로그인 정보를 계속 저장할 변수
    public static MemberVO info;        //공유해서 씀

}
  • MemberVO 클래스에 implements 삭제
  • Login.java파일 에서
    MemverVO 말고 LoginCheck클래스의 info 필드에 담아주면 info가 유지되어 공유가능
  • LoginSuccess java파일
    vo.getId()~ 지우고 LoginCheck.info.getId()
    info필드 정보를 MemberVO 타입으로 묶어서 쓸 수 있다.
  • 로그아웃 시 LoginCheck.info = null;
package com.example.ex220516;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;

import org.w3c.dom.Text;

public class LoginSuccess extends AppCompatActivity {
    private TextView tv_login_id,tv_login_pw,tv_login_nick,tv_login_phone;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login_success);
        tv_login_id = findViewById(R.id.tv_login_id);
        tv_login_pw = findViewById(R.id.tv_login_pw);
        tv_login_nick = findViewById(R.id.tv_login_nick);
        tv_login_phone = findViewById(R.id.tv_login_phone);

        //Intent intent = getIntent();
        // MemberVO vo = (MemberVO) intent.getSerializableExtra("vo");

        tv_login_id.setText(LoginCheck.info.getId());
        tv_login_pw.setText(LoginCheck.info.getPw());
        tv_login_nick.setText(LoginCheck.info.getNick());
        tv_login_phone.setText(LoginCheck.info.getPhone());
        
        MemberVO info = LoginCheck.info;        //로그인정보를 담아 세션처럼 사용할 수있음

        // 로그아웃 시
        // LoginCheck.info = null;
    }
}

0개의 댓글