개발환경 : 인텔리제이 / Springboot2 / maven
구글, 네이버, 카카오 등에서 제공하는 간편로그인 기능도 OAuth2.0 프로토콜 기반이다.
구글 OAuth2.0은 아래 링크를 참고
구글 OAuth2.0
OAuth2.0 프로토콜에 관련해서는 아래 블로그에서 잘 정리되어있다.
OAuth2.0에 관련된 설명
@Controller
public class TestController {
@GetMapping
@RequestMapping("/test")
public String test(Model model, @RequestParam Map<String, String> param){
String invite = param.get("invite");
String userid = param.get("userid");
String passwd = param.get("passwd");
model.addAllAttributes(param);
//model.addAttribute("invite", invite);
return "dir/test";
}
@GetMapping
@RequestMapping("/test2")
public String test2(){
return "test";
}
}
관련 참고할만한 내용 : Controller에서 view로 데이터 전송요청
비동기 자바스크립트와 XML(Asychronous JavaScript And XML)을 말함.
서버와 통신하기 위해 XMLHttpRequest 객체를 사용하는 것
JSON,XML,HTML 일반 텍스트 형식 등 다양한 포맷을 주고 받을 수 있음.
페이지 전체를 리프레쉬 하지 않고 수행되는 "비동기성"이 강점
Javascript 객체 문법을 따르는 문자 기반 데이터 포맷
네트워크 통해 전송할때 유용
데이터에 엑세스 하기 위해서는 네이티브 json 객체로 변환할 필요 있음
문자열에서 네이티브 객체로 변환하는 것을 파싱Parsing 이라고 한다.
네트워크를 통해 전달할 수 있게 문자열로 변환 하는 것을 문자열화 Stringifcation 이라고 함
출처 : JSON으로 작업하기
ajax 부분을 다음과 같이 코딩하고 jsp에 연결해둔다.
$ajax = {
ajax: function (url, param, type, callBack, errCallBack) {
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () { // 요청에 대한 콜백함수
if (xhr.readyState === xhr.DONE) { // 요청이 완료되면 실행
if (xhr.status === 200 || xhr.status === 201) { // 응답 코드가 200 혹은 201
callBack(xhr.responseText);
} else {
errCallBack(xhr.reponseText);
}
}
};
xhr.open(type, url); // http 메서드와 URL설정
xhr.setRequestHeader('Content-Type', 'application/json'); // 콘텐츠 타입을 json으로
xhr.send(JSON.stringify(param)); // 요청 전송
},
get: function (url, param, callBack, errCallBack) {
$ajax.ajax(url, param, 'GET', callBack, errCallBack);
},
post: function (url, param, callBack, errCallBack) {
$ajax.ajax(url, param, 'POST', callBack, errCallBack);
}
}
로그인 버튼을 onclick 했을 때 다음 login 함수가 실행된다
$login = {
baseUrl: 'localhost:8081/api',
login: function () {
var userid = document.getElementById('userid').value;
var passwd = document.getElementById('passwd').value;
if (userid == '') {
alert("아이디를 입력해주세요");
return;
}
if (passwd == '') {
alert("비밀번호를 입력해주세요");
return;
}
var url = '/api/members/member';
var param = {
userid: userid,
passwd: passwd
}
$ajax.post(url, param, $login.callBack, $login.errCallBack);
},
callBack: function (response) {
var json = JSON.parse(response);
if (json['rtnCd'] == 0) {
//todo success
var rtnObj = json['rtnObj'];
var idx = rtnObj['idx'];
var stat = rtnObj['stat'];
document.getElementById('idx').value = idx;
document.getElementById('stat').value = stat;
document.getElementById('login').submit();
} else {
alert(json['rtnMsg'])
}
},
errCallBack: function (response) {
alert("시스템 오류입니다.");
}
}