SpringBoot 전단 인증 코드 이미지 생 성 및 검증 실현

SpringBoot 에서 전단 인증 코드 이미지 의 생 성과 검증 을 실현 합 니 다.참고 하 시기 바 랍 니 다.구체 적 인 내용 은 다음 과 같 습 니 다.
1.효과

인증 코드 를 누 르 면 새로운 인증 코드 를 가 져 올 수 있 습 니 다.
2.원리
배경 에 인증 코드 그림 을 생 성하 여 그림 을 프론트 에 전달 합 니 다.
배경 은 session 에 인증 코드 내용 을 저장 합 니 다.
프론트 데스크 톱 에 인증 코드 를 입력 한 후 백 스테이지 로 전송 하여 세 션 에 저 장 된 인증 코드 를 꺼 내 검사 합 니 다.
인증 코드 의 명문 은 전단 으로 전송 할 수 없습니다.전단 내용 이 모두 투명 하고 안전 하지 않다.인증 코드 는 로봇 을 막 는 데 쓰 이 는 것 이지 사람 만 막 는 것 이 아니다.인증번호 명문 을 전단 으로 전달 하면 쉽게 풀 릴 수 있다.
3.그림 생 성
인증 코드 생 성 도구 클래스 RandomValidateCodeUtil

public class RandomValidateCodeUtil {


 public static final String RANDOMCODEKEY= "RANDOMVALIDATECODEKEY";//  session  key
 private String randString = "0123456789";//             private String
 //private String randString = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";//            
 //private String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";//               
 private int width = 95;//    
 private int height = 25;//    
 private int lineSize = 40;//      
 private int stringNum = 4;//         

 private static final Logger logger = LoggerFactory.getLogger(RandomValidateCodeUtil.class);

 private Random random = new Random();

 /**
  *     
  */
 private Font getFont() {
  return new Font("Fixedsys", Font.CENTER_BASELINE, 18);
 }

 /**
  *     
  */
 private Color getRandColor(int fc, int bc) {
  if (fc > 255)
   fc = 255;
  if (bc > 255)
   bc = 255;
  int r = fc + random.nextInt(bc - fc - 16);
  int g = fc + random.nextInt(bc - fc - 14);
  int b = fc + random.nextInt(bc - fc - 18);
  return new Color(r, g, b);
 }

 /**
  *       
  */
 public void getRandcode(HttpServletRequest request, HttpServletResponse response) {
  HttpSession session = request.getSession();
  // BufferedImage        Image ,Image            
  BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
  Graphics g = image.getGraphics();//   Image   Graphics  ,                 
  g.fillRect(0, 0, width, height);//    
  g.setFont(new Font("Times New Roman", Font.ROMAN_BASELINE, 18));//    
  g.setColor(getRandColor(110, 133));//    
  //      
  for (int i = 0; i <= lineSize; i++) {
   drowLine(g);
  }
  //       
  String randomString = "";
  for (int i = 1; i <= stringNum; i++) {
   randomString = drowString(g, randomString, i);
  }
  logger.info(randomString);
  //            session 
  session.removeAttribute(RANDOMCODEKEY);
  session.setAttribute(RANDOMCODEKEY, randomString);
  g.dispose();
  try {
   //                    
   ImageIO.write(image, "JPEG", response.getOutputStream());
  } catch (Exception e) {
   logger.error("                     >>>> ", e);
  }

 }

 /**
  *      
  */
 private String drowString(Graphics g, String randomString, int i) {
  g.setFont(getFont());
  g.setColor(new Color(random.nextInt(101), random.nextInt(111), random
    .nextInt(121)));
  String rand = String.valueOf(getRandomString(random.nextInt(randString
    .length())));
  randomString += rand;
  g.translate(random.nextInt(3), random.nextInt(3));
  g.drawString(rand, 13 * i, 16);
  return randomString;
 }

 /**
  *      
  */
 private void drowLine(Graphics g) {
  int x = random.nextInt(width);
  int y = random.nextInt(height);
  int xl = random.nextInt(13);
  int yl = random.nextInt(15);
  g.drawLine(x, y, x + xl, y + yl);
 }

 /**
  *        
  */
 public String getRandomString(int num) {
  return String.valueOf(randString.charAt(num));
 }
}

Controller 에서 인증 코드 그림 생 성 방법 을 호출 하고 그림 을 전단 으로 전송 합 니 다.

/**
 *      
 */
@RequestMapping(value = "/getVerify")
public void getVerify(HttpServletRequest request, HttpServletResponse response) {
 try {
  response.setContentType("image/jpeg");//      ,             
  response.setHeader("Pragma", "No-cache");//       ,            
  response.setHeader("Cache-Control", "no-cache");
  response.setDateHeader("Expire", 0);
  RandomValidateCodeUtil randomValidateCode = new RandomValidateCodeUtil();
  randomValidateCode.getRandcode(request, response);//         
 } catch (Exception e) {
  logger.error("       >>>> ", e);
 }
}
전단 인증 코드 이미지 가 져 오기
html

<div class="row">
 <div class="col-xs-6 pull_left">
  <div class="form-group">
   <input class="form-control" type="tel" id="verify_input" placeholder="      " maxlength="4">
  </div>
 </div>
 <div class="col-xs-6 pull_left">
  <a href="javascript:void(0);" rel="external nofollow" title="       ">
   <img id="imgVerify" src="" alt="     " height="36" width="100%" onclick="getVerify(this);">
  </a>
 </div>
</div>
js

//     
function getVerify(obj){
 obj.src = httpurl + "/sys/getVerify?"+Math.random();
}
그림 을 클릭 할 때마다 인증 코드 를 다시 갱신 합 니 다.
인터페이스 가 처음 불 러 올 때 getVerify()방법 을 호출 하면 됩 니 다.
4.인증번호 검증
전단 에서 사용자 가 입력 한 인증 코드 를 가 져 와 배경 으로 보 내 검증 합 니 다.
백그라운드 인증 코드

/**
 *            
 */
@RequestMapping(value = "/checkVerify", method = RequestMethod.POST, headers = "Accept=application/json")
public boolean checkVerify(@RequestBody Map<String, Object> requestMap, HttpSession session) {
 try{
  // session      
  String inputStr = requestMap.get("inputStr").toString();
  String random = (String) session.getAttribute("RANDOMVALIDATECODEKEY");
  if (random == null) {
   return false;
  }
  if (random.equals(inputStr)) {
   return true;
  } else {
   return false;
  }
 }catch (Exception e){
  logger.error("       ", e);
  return false;
 }
}
배경 검증 후 전단 검증 결과 true 나 false 로 되 돌아 가면 됩 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기