HD

글 자동 등록 방지 (feat.simplecaptcha) 본문

JAVA

글 자동 등록 방지 (feat.simplecaptcha)

hunecenter 2019. 1. 24. 11:21
반응형

개발 도중 게시판에 자동 등록 방지를 해달라는 요청이와서 작업해야 하는데 뭐로 할지가 고민이.....



네이버의 captcha API




Google reCAPTCHA API



위 2개중에 구현을 할려다 찾아보니 simplecaptcha를 발견 쉽게 구현할수 있었다!!!





simplecaptchar를 사용할려면  simplecaptcha-1.2.1.jar 를 다운받아 lib에 추가 하고 사용하면된다.



Controller 부분


@Controller

@RequestMapping("/captcha")

public class CaptChaController {

/** javax.servlet.http.HttpServletRequest */

    @Autowired

    private HttpServletRequest request;

    

@RequestMapping("/getImg")

public void getImg(final HttpServletResponse response) throws IOException{

int width = Integer.parseInt(request.getParameter("width")!=null ? request.getParameter("width") : "150");

int height = Integer.parseInt(request.getParameter("width")!=null ? request.getParameter("height") : "20");

int size = Integer.parseInt(request.getParameter("width")!=null ? request.getParameter("size") : "30");

List<java.awt.Color> textColors = Arrays.asList(Color.BLACK);

List<java.awt.Font> textFonts = Arrays.asList(

new Font("Arial", Font.ITALIC, size), 

new Font("Courier", Font.PLAIN, size));

try{

    Captcha captcha = new Captcha.Builder(width, height)

 /*defulat로 5개의 랜덤한 알파벳과 숫자를 생성*/

    .addText(new DefaultTextProducer(), new DefaultWordRenderer(textColors, textFonts))

    .addBackground(new GradiatedBackgroundProducer()) /*Gradiated백그라운드 효과 추가*/

    .addNoise()    /*한번 호출할 떄마다 하나의 라인이 추가된다*/

    //.gimp() /*그림자 효과 추가*/

    .addBorder()  /*검정 테두리 선 생성*/

    .build();  /*필수 호출함수*/

   

        response.setHeader("Cache-Control", "no-store");

            response.setHeader("Pragma", "no-cache");

            // 캐쉬를 지우기 위해 헤더값을 설정

            response.setDateHeader("Expires", 0);

            // 리턴값을 image형태로 설정

            response.setContentType("image/jpeg");

            // Image를 write 한다

            writeImage(response, captcha.getImage());

            // 세션에 자동가입방지 문자를 저장한다.

            request.getSession().setAttribute(Captcha.NAME, captcha);

    }catch(Exception e){

            response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);

            return;

    }

    }

@RequestMapping("/isCorrect")

public String isCorrect(

String answer,

ModelMap model

){

Captcha captcha = (Captcha) request.getSession().getAttribute(Captcha.NAME);

boolean result = false;

if(captcha.isCorrect(answer)){

result = true;

}

JsonObject obj = new JsonObject();

obj.addProperty("result", result);

model.addAttribute( "obj", obj ); 

return "obj";

}

    

    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();

        }

    }

}


javascript 부분


$(function(){

$("#reLoad").click(function() {

changeCaptcha();

});

});


var rand;

function changeCaptcha(){

rand = Math.random();

$("#captchaImg").attr("src", "/captcha/getImg.do?width=100&height=30&size=30&id="+rand);

}


function isCaptCha(){

var url = "/captcha/isCorrect.do";

var answer = $("#captcha").val();

var d = {"answer":answer};

var r = getAjax(url,d);

if(r != null && r.result){

return true;

}else{

return false;

}

}


if($("#captcha").val() == ''){

alert("자동 등록 방지 문자를 입력해주세요.");

return false;

}

if(!isCaptCha()){

alert("자동등록방지문자가 일치하지 않습니다.", function(){

$("#captcha").focus();

  });

return false;

}



jsp 부분


<img id="captchaImg" src="/captcha/getImg.do?width=100&height=30" alt="스팸방지코드">

<input type="text" name="" id="captcha" class="">

<input type="button" id="reLoad" value="새로고침">



완성!!!!






반응형
Comments