NAVER CLOUD PLATFORM 의 CAPTCHA API 사용하기
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class Test906 {
public static void main(String[] args) {
String clientId = "...";// 애플리케이션 클라이언트 아이디값";
String clientSecret = "...";// 애플리케이션 클라이언트 시크릿값";
try {
String code = "0"; // 키 발급시 0, 캡차 이미지 비교시 1로 세팅
String apiURL = "https://naveropenapi.apigw.ntruss.com/captcha/v1/nkey?code=" + code;
URL url = new URL(apiURL);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestMethod("GET");
con.setRequestProperty("X-NCP-APIGW-API-KEY-ID", clientId);
con.setRequestProperty("X-NCP-APIGW-API-KEY", clientSecret);
int responseCode = con.getResponseCode();
BufferedReader br;
if (responseCode == 200) { // 정상 호출
br = new BufferedReader(new InputStreamReader(con.getInputStream()));
} else { // 오류 발생
br = new BufferedReader(new InputStreamReader(con.getErrorStream()));
}
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = br.readLine()) != null) {
response.append(inputLine);
}
br.close();
System.out.println(response.toString());
} catch (Exception e) {
System.out.println(e);
}
}
}
위의 코드에서 setRequestProperty
에 지정한 값은 요청한 jsp 에서 reqeust.getHeader()
를 이용해서 추출할 수 있다. 즉 보안정보는 요청의 body 가 아니라 header 정보를 이용하여 전달하고 있음을 알 수 있다.
InputStreamReader
: InputStream 의 byte 단위 입출력을 Reader 의 char 단위 입출력으로 바꿔주는 역할을 한다. ( 이 때 문자셋을 바꿔주기도 한다. )
BufferedReader
: 한 줄씩 읽어들이는 readLine() 함수를 쓰기위해 많이 활용
java.net.URL
: ajax 와 마찬가지로 요청을 발생시켜 응답을 받아들이는 역할을 한다.
( ajax 와 다른점은 비동기적으로 동작하지 않는다. 즉 요청을 발생시키고 응답올때까지 기다린다. )
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Date;
public class Test907 {
public static void main(String[] args) {
String clientId = "...";//애플리케이션 클라이언트 아이디값";
try {
String key = "..."; // https://naveropenapi.apigw.ntruss.com/captcha/v1/nkey 호출로 받은 키값
String apiURL = "https://naveropenapi.apigw.ntruss.com/captcha-bin/v1/ncaptcha?key=" + key + "&X-NCP-APIGW-API-KEY-ID" + clientId;
URL url = new URL(apiURL);
HttpURLConnection con = (HttpURLConnection)url.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader br;
if(responseCode==200) { // 정상 호출
InputStream is = con.getInputStream();
int read = 0;
byte[] bytes = new byte[1024];
// 랜덤한 이름으로 파일 생성
String tempname = Long.valueOf(new Date().getTime()).toString();
File f = new File( Util.upload() + tempname + ".jpg");
f.createNewFile();
OutputStream outputStream = new FileOutputStream(f);
while ((read =is.read(bytes)) != -1) {
outputStream.write(bytes, 0, read);
}
is.close();
} else { // 오류 발생
br = new BufferedReader(new InputStreamReader(con.getErrorStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = br.readLine()) != null) {
response.append(inputLine);
}
br.close();
System.out.println(response.toString());
}
} catch (Exception e) {
System.out.println(e);
}
}
}
지정 폴더에 이미지 저장되는 것 확인
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class Test908 {
public static void main(String[] args) {
String clientId = "...";//애플리케이션 클라이언트 아이디값";
String clientSecret = "...";//애플리케이션 클라이언트 시크릿값";
try {
String code = "1"; // 키 발급시 0, 캡차 이미지 비교시 1로 세팅
String key = "..."; // 캡차 키 발급시 받은 키값
String value = "..."; // 사용자가 입력한 캡차 이미지 글자값
String apiURL = "https://naveropenapi.apigw.ntruss.com/captcha/v1/nkey?code=" + code +"&key="+ key + "&value="+ value;
URL url = new URL(apiURL);
HttpURLConnection con = (HttpURLConnection)url.openConnection();
con.setRequestMethod("GET");
con.setRequestProperty("X-NCP-APIGW-API-KEY-ID", clientId);
con.setRequestProperty("X-NCP-APIGW-API-KEY", clientSecret);
int responseCode = con.getResponseCode();
BufferedReader br;
if(responseCode==200) { // 정상 호출
br = new BufferedReader(new InputStreamReader(con.getInputStream()));
} else { // 오류 발생
br = new BufferedReader(new InputStreamReader(con.getErrorStream()));
}
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = br.readLine()) != null) {
response.append(inputLine);
}
br.close();
System.out.println(response.toString());
} catch (Exception e) {
System.out.println(e);
}
}
}
결과 true/flase 로 확인 가능
project p0124_2
: CAPTCHA 와 Servlet 같이 사용하기
public class Test909 extends HttpServlet {
@Override
public void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException
{
String clientId = "...";// 애플리케이션 클라이언트 아이디값";
String clientSecret = "...";// 애플리케이션 클라이언트 시크릿값";
String key = null;
try {
String code = "0"; // 키 발급시 0, 캡차 이미지 비교시 1로 세팅
String apiURL = "https://naveropenapi.apigw.ntruss.com/captcha/v1/nkey?code=" + code;
URL url = new URL(apiURL);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestMethod("GET");
con.setRequestProperty("X-NCP-APIGW-API-KEY-ID", clientId);
con.setRequestProperty("X-NCP-APIGW-API-KEY", clientSecret);
int responseCode = con.getResponseCode();
BufferedReader br;
if (responseCode == 200) { // 정상 호출
br = new BufferedReader(new InputStreamReader(con.getInputStream()));
} else { // 오류 발생
br = new BufferedReader(new InputStreamReader(con.getErrorStream()));
}
String inputLine;
StringBuffer sb = new StringBuffer();
while ((inputLine = br.readLine()) != null) {
sb.append(inputLine);
}
br.close();
JSONObject jo = new JSONObject(sb.toString());
key = jo.getString("key");
} catch (Exception e) {
System.out.println(e);
}
String tempname = null;
try {
String apiURL = "https://naveropenapi.apigw.ntruss.com/captcha-bin/v1/ncaptcha?key=" + key + "&X-NCP-APIGW-API-KEY-ID" + clientId;
URL url = new URL(apiURL);
HttpURLConnection con = (HttpURLConnection)url.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader br;
if(responseCode==200) { // 정상 호출
InputStream is = con.getInputStream();
int read = 0;
byte[] bytes = new byte[1024];
// 랜덤한 이름으로 파일 생성
tempname = Long.valueOf(new Date().getTime()).toString();
File f = new File( Util.upload() + tempname + ".jpg");
f.createNewFile();
OutputStream outputStream = new FileOutputStream(f);
while ((read =is.read(bytes)) != -1) {
outputStream.write(bytes, 0, read);
}
is.close();
} else { // 오류 발생
br = new BufferedReader(new InputStreamReader(con.getErrorStream()));
String inputLine;
StringBuffer sb = new StringBuffer();
while ((inputLine = br.readLine()) != null) {
sb.append(inputLine);
}
br.close();
System.out.println(sb.toString());
}
} catch (Exception e) {
System.out.println(e);
}
request.setAttribute("key", key );
request.setAttribute("fname", tempname );
RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/test_909_1.jsp");
rd.forward(request, response);
}
}
발급받은 key 값과 저장할때 사용한 파일 이름을 test_909_1.jsp 로 forward 시켜
/WEB-INF/test_909_1.jsp
<body>
${key}<br/>
<img src="image.jsp?fname=${fname}"/>
<br/>
<form method="POST" action="test910">
<input type="hidden" name="key" value="${key}"/>
<input type="text" name="captcha"/>
<input type="submit"/>
</form>
</body>
${key}, ${fname} 으로 값을 받아 아래의 화면을 구현
action="test910"
public class Test910 extends HttpServlet {
@Override
public void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException
{
String clientId = "...";
String clientSecret = "...";
// jsp 로부터 key 값 받아오기
String key = request.getParameter("key");
// jsp 로부터 captcha 값 받아오기
String value = request.getParameter("captcha");
boolean result = false;
try {
String code = "1"; // 키 발급시 0, 캡차 이미지 비교시 1로 세팅
String apiURL = "https://naveropenapi.apigw.ntruss.com/captcha/v1/nkey?code=" + code +"&key="+ key + "&value="+ value;
URL url = new URL(apiURL);
HttpURLConnection con = (HttpURLConnection)url.openConnection();
con.setRequestMethod("GET");
con.setRequestProperty("X-NCP-APIGW-API-KEY-ID", clientId);
con.setRequestProperty("X-NCP-APIGW-API-KEY", clientSecret);
int responseCode = con.getResponseCode();
BufferedReader br;
if(responseCode==200) { // 정상 호출
br = new BufferedReader(new InputStreamReader(con.getInputStream()));
} else { // 오류 발생
br = new BufferedReader(new InputStreamReader(con.getErrorStream()));
}
String inputLine;
StringBuffer sb = new StringBuffer();
while ((inputLine = br.readLine()) != null) {
sb.append(inputLine);
}
br.close();
JSONObject jo = new JSONObject(sb.toString());
// 사용자가 text박스 에 입력한 값과 captcha 이미지 안의 값이 같으면 true
result = jo.getBoolean("result");
} catch (Exception e) {
System.out.println(e);
}
System.out.println( result );
}
}
text 타입의 input 에 캡차 이미지속의 값을 입력하고 제출을 누르면
Test910
코드를 실행시켜 콘솔창에 true 가 나오도록 구현