로그인 또는 회원가입 시 자동 등록 방지가 필요할 경우가 있다. 이를 구현하기 위해 여러 가지가 있는데 CATPCHA를 사용하는 방법을 사용하였다.
CAPTCHA는 HIP 기술의 일종으로, 어떠한 사용자가 실제 사람인지 컴퓨터 프로그램인지를 구별하기 위해 사용되는 방법이다. 사람은 구별할 수 있지만 컴퓨터는 구별하기 힘들게 의도적으로 비틀거나 덧칠한 그림을 주고 그 그림에 쓰여 있는 내용을 물어보는 방법이 자주 사용된다.
위키백과
다운로드
CATPCHA를 사용하기 위해선 https://sourceforge.net/projects/simplecaptcha/ 사이트로 이동해서 jar 파일을 다운로드 받는다.
jar 파일 추가
사용하는 툴이 이클립스 일 경우 jar 파일을 프로젝트에 포함시켜야 한다. 아래 이전 글을 참고해서 추가합니다.
사용
HTML
먼저 자동입력 방지 기능을 넣기 위한 화면 코드다. CATPCHA 이미지를 보여주고 이미지 안의 숫자들을 새로고침 할 수 있는 버튼을 만들었다.
<div class="mt-3">
<label class="form-label fw-bold">자동입력 방지문자</label>
<div class="d-flex">
<img id="captchaImg" src="captchaImg" title="캡차 이미지" alt="캡차 이미지" />
<button type="button" id="refresh_btn" class="btn btn-sm btn-gray w-50 ms-2">새로고침</button>
</div>
<div class="d-flex mt-1">
<input id="captcha" type="text" class="form-control input-control" />
</div>
</div>
Controller 부분
html에서 /captchaImg
경로를 호출하면 아래 컨트롤러가 호출된다. Captcha 이미지 설정을 한 후 세션에 값을 저장하고 이미지를 그려준다.
/**
* captchaImg
* @param request
* @param response
* @throws IOException
*/
@GetMapping("captchaImg")
public void captchaImg(HttpServletRequest request, HttpServletResponse response) throws IOException {
try {
// 폰트 설정 =========================================================
List<Font> fontList = new ArrayList<Font>();
fontList.add(new Font("", Font.HANGING_BASELINE, 28));
fontList.add(new Font("Courier", Font.ITALIC, 28));
fontList.add(new Font("", Font.PLAIN, 28));
List<Color> colorList = new ArrayList<Color>();
colorList.add(Color.black);
Captcha captcha = new Captcha.Builder(200, 36) // 이미지 크기 설정
.addText(new NumbersAnswerProducer(6), new DefaultWordRenderer(colorList, fontList))
//.gimp(new DropShadowGimpyRenderer()).gimp() // 그림자 효과 추가
.addNoise().addNoise() // 한번 호출할 떄마다 하나의 라인이 추가된다
.addBackground(new GradiatedBackgroundProducer()) // Gradiated백그라운드 효과 추가
.addBorder() // 검정 테두리 선 생성
.build();
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
// 캐쉬를 지우기 위해 헤더값을 설정
response.setDateHeader("Expires", 0);
response.setDateHeader("Max-Age", 0);
// 리턴값을 image형태로 설정
response.setContentType("image/png");
// 세션에 자동가입방지 문자를 저장한다.
request.getSession().setAttribute(Captcha.NAME, captcha);
// Image를 write 한다
CaptchaServletUtil.writeImage(response, captcha.getImage());
} catch (Exception e) {
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
return;
}
}
다음은 현재 보이는 자동입력 방지문자와 입력한 문자가 일치하는 하는지 확인하는 코드다.
/**
* 자동입력 방지문자 확인
*/
@GetMapping("isCorrect")
public ResponseEntity<?> isCorrect(HttpServletRequest request, String answer) {
boolean result = false;
Captcha captcha = (Captcha) request.getSession().getAttribute(Captcha.NAME);
if (captcha.isCorrect(answer)) {
result = true;
}
return new ResponseEntity<>(result, HttpStatus.OK);
}
JavaScript
화면단에서 자등입력 방지문자를 잘 입력했는지 확인하는 코드다.
// 자동입력 방지문자가 일치하는지 확인
const isCaptCha = () => {
const answer = $('#captcha').val();
if (answer == '') {
alert('자동입력 방지문자를 입력해주세요.');
return;
}
let result = false;
$.ajax({
url: `${contextPath}/signup/isCorrect`,
type: 'GET',
data: { answer: answer },
async: false,
success: function (response) {
result = response;
},
});
return result;
};
if (!isCaptCha()) {
alert('자동입력 방지문자가 일치하지 않습니다.', function () {
$('#captcha').focus();
});
return;
} else {
alert('자동입력 방지문자가 일치합니다.');
}
새로고침 버튼을 누를 경우 자동입력 방지문자 이미지 안의 숫자가 바뀐다.
/**
* 자동입력 방지문자 새로고침
*/
$('#refresh_btn').click(function () {
$('#captchaImg').attr('src', 'captchaImg');
});
화면
성공적으로 자동입력 방지문자 이미지를 가져왔다! 위의 방법처럼 쉽게 구현할 수 있다.
'Language > JavaScript' 카테고리의 다른 글
JavaScript 프레임워크 비교: Angular, React, Vue.js (0) | 2023.12.16 |
---|---|
[JavaScript] Array Methods (0) | 2023.09.10 |
[OpenLayers] Feature Drag and Drop (0) | 2022.12.27 |
[OpenLayers] Custom Icon Feature 추가 (0) | 2022.12.26 |
[OpenLayers] Static Image 사용 방법 (0) | 2022.12.21 |
IT 기술과 개발 내용을 포스팅하는 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!