일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 브라우저
- Firebase
- WINDOW11
- JEUS
- dbms
- 알고리즘
- 물리적주소
- User-Agent
- eGov
- Tomcat
- FCM
- @Scheduled
- ua-parser
- Java
- 접근장치
- window10
- Oracle
- Login
- Was
- 개발자도구
- web server
- WebtoB
- URLRewirte
- 암호화
- programmers
- db
- scheduled
- TailMe
- mysql
- AES
- Today
- Total
HD
글 자동 등록 방지 (feat.simplecaptcha) 본문
개발 도중 게시판에 자동 등록 방지를 해달라는 요청이와서 작업해야 하는데 뭐로 할지가 고민이.....
네이버의 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="새로고침">
완성!!!!
'JAVA' 카테고리의 다른 글
이클립스 invalid LOC header 에러발생시 (0) | 2021.05.26 |
---|---|
JAVA DB Connection (feat. mysql, oracle) (0) | 2020.12.28 |
PHP 직렬화 -> JAVA 데이터 변환 (feat.pherialize-1.2.4.jar) (0) | 2020.12.28 |
SSLHandshakeException 오류 (0) | 2020.04.27 |
referer를 사용 한 이전 URL 가져오기 (feat.referer) (0) | 2019.11.06 |