티스토리 뷰

   자동가입을 방지하는 문자열 입력을 구현할 때, 보통 많이 사용하는 것이 simplecaptcha와 jcaptcha 라이브러리다.


   여기선 simplecaptcha를 이용해서 구현하는 방법을 살펴보겠다.


      ↓참고한 곳

   - http://simplecaptcha.sourceforge.net

   - http://winflahed.tistory.com/132

   - https://github.com/ndkhoiits/Simplecaptcha/blob/master/src/main/java/nl/captcha/servlet/CaptchaServletUtil.java




   먼저 필요한 jar파일을 다운로드 받아서 빌드패스에 추가해준다.


simplecaptcha.zip


   jj-simplecaptcha.jar, jj-imaging.jar 이 두 개가 필요하다.



   빌드패스를 마쳤다면, 코딩을 시작해보자.


   먼저 이미지를 만들어주는 클래스다. 이게 원래 라이브러리 안에 포함되어있는 클래스 같은데,, 내가 뭔가 필요한 jar 파일을 빠드린 것 같은 느낌이다.

   그냥 난 아래와 같이 만들어줬다.


import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletResponse;

final class CaptchaServletUtil {
	
	public static void writeImage(HttpServletResponse response, BufferedImage bi) {
		
		response.setHeader("Cache-Control", "private,no-cache,no-store");
		response.setContentType("image/png");
		
		try {
			writeImage(response.getOutputStream(), bi);
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}

	public static void writeImage(OutputStream os, BufferedImage bi) {
		
		try {
			ImageIO.write(bi, "png", os);
			os.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
	
}



   그리고나서 위 클래스를 사용하는 서블릿 클래스를 작성한다.


import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import jj.play.ns.nl.captcha.Captcha;

public class CaptchaServlet extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		try {
			// 200 * 50 에해당하는 이미지 사이즈를 지정하고, 자동가입방지 문자 길이를 설정한다.
			Captcha captcha = new Captcha.Builder(250, 60)
									.addText()
									.addBackground()
									.addNoise()
									.addBorder()
									.build();

			response.setHeader("Cache-Control", "no-store");
			response.setHeader("Pragma", "no-cache");
			// 캐쉬를 지우기 위해 헤더값을 설정
			response.setDateHeader("Expires", 0);
			// 리턴값을 image형태로 설정
			response.setContentType("image/jpeg");
			// Image를 write 한다
			CaptchaServletUtil.writeImage(response, captcha.getImage());
			// 세션에 자동가입방지 문자를 저장한다.
			request.getSession().setAttribute("correctAnswer", captcha.getAnswer());
			System.out.println("captcha 자동가입방지 문자 : " + captcha.getAnswer());
		} catch (Exception e) {
			System.out.println(e.getMessage());
			System.out.println(e.getStackTrace());
			response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
			return;
		}

	}

}




   web.xml에 위의 서블릿을 등록하는 것도 잊지 말자.



	CaptchaServlet
	packageName1.packageName2.packageName3.CaptchaServlet
	1



	CaptchaServlet
	/captcha




   마지막으로 보안 이미지를 띄울 jsp 페이지다. 참고로 이미지의 src 경로는 /captcha 앞에 <%=request.getContextPath() %>나 <c:url value='/captcha'/>를 붙여주든지 해서 프로젝트 경로를 써줘야 한다. 경로 틀리게 써놓고 "이거 왜 안되죠~?"하지 않기를.


captcha img

새로고침

   




   보안 이미지가 이런 식으로 나온다면 성공이다.




   새로고침을 하고 싶다면, 새로고침 텍스트에 onclick으로 function을 걸어서 아래와 같이 해주자.


function imgRefresh(){
	$("#captchaImg").attr("src", "/captcha?id=" + Math.random());
}




   이미지 스타일을 변경하고 싶다면, http://simplecaptcha.sourceforge.net/custom_images.html 를 참고할 것.

   CaptchaServlet에서 new Captcha.Builder 부분만 약간 바꿔주면 된다.



   사용자가 입력한 값이 맞는지 틀리는지 검증하는 부분은 jsp 페이지에서 submit으로 넘어가는 자바단에서 하면 된다.


   CaptchaServlet에서 "correctAnswer"로 세션에 저장해놓았으니, 검증하는 부분에서 사용자가 입력한 값과 getSession("correctAnswer");에 있는 값을 비교하면 될 것이다.



댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함