자바 는 어떻게 인증 코드 검증 기능 을 실현 합 니까?
자바 가 인증 코드 검증 기능 을 실현 하 는 것 은 매우 간단 하 다.하나의 Graphics 류 를 사용 하여 화판 에 자 모 를 그리고 일정한 수량의 자 모 를 무 작위 로 선택 하여 무 작위 로 생 성 한 다음 에 화판 에 무 작위 로 몇 개의 간섭 선 을 생 성 한다.
우선,인증 코드 를 써 서 도움말 클래스 를 만 들 고 무 작위 알파벳 을 그립 니 다.
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;
import javax.imageio.ImageIO;
public final class GraphicHelper {
/**
* ,
*
* @param width
*
* @param height
*
* @param imgType
*
* @param output
* ( )
* @return ( )
*/
public static String create(final int width, final int height, final String imgType, OutputStream output) {
StringBuffer sb = new StringBuffer();
Random random = new Random();
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics graphic = image.getGraphics();
graphic.setColor(Color.getColor("F8F8F8"));
graphic.fillRect(0, 0, width, height);
Color[] colors = new Color[] { Color.BLUE, Color.GRAY, Color.GREEN, Color.RED, Color.BLACK, Color.ORANGE,
Color.CYAN };
// " " ( 50 )
for (int i = 0; i < 50; i++) {
graphic.setColor(colors[random.nextInt(colors.length)]);
final int x = random.nextInt(width);
final int y = random.nextInt(height);
final int w = random.nextInt(20);
final int h = random.nextInt(20);
final int signA = random.nextBoolean() ? 1 : -1;
final int signB = random.nextBoolean() ? 1 : -1;
graphic.drawLine(x, y, x + w * signA, y + h * signB);
}
// " "
graphic.setFont(new Font("Comic Sans MS", Font.BOLD, 30));
for (int i = 0; i < 6; i++) {
final int temp = random.nextInt(26) + 97;
String s = String.valueOf((char) temp);
sb.append(s);
graphic.setColor(colors[random.nextInt(colors.length)]);
graphic.drawString(s, i * (width / 6), height - (height / 3));
}
graphic.dispose();
try {
ImageIO.write(image, imgType, output);
} catch (IOException e) {
e.printStackTrace();
}
return sb.toString();
}
}
이 어 그림 크기 를 고정 시 키 고 인증 코드 를 처리 하 는 데 사용 되 는 servlet 를 만 들 고 페이지 에서 생 성 된 인증 코드 를 캡 처 합 니 다(캡 처 된 QR 코드 는 사용자 가 입력 한 인증 코드 와 일치 해 야 통과 할 수 있 습 니 다).
import java.io.IOException;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebServlet(urlPatterns = "/verify/regist.do" )
public class VerifyCodeServlet extends HttpServlet {
private static final long serialVersionUID = 3398560501558431737L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//
HttpSession session = request.getSession();
// URI ( )
String uri = request.getRequestURI();
System.out.println("hello : " + uri);
final int width = 180; //
final int height = 40; //
final String imgType = "jpeg"; // ( MIME )
final OutputStream output = response.getOutputStream();
//
// ( )
//
String code = GraphicHelper.create(width, height, imgType, output);
System.out.println(" : " + code);
// uri ( )
session.setAttribute(uri, code);
System.out.println(session.getAttribute(uri));
}
}
다음 에 HTML 등록 페이지 를 써 서 검사 합 니 다.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title> </title>
<link rel="stylesheet" href="styles/general.css" >
<link rel="stylesheet" href="styles/cell.css">
<link rel="stylesheet" href="styles/form.css">
<script type="text/javascript" src="js/ref.js"></script>
<style type="text/css" >
.logo-container {
margin-top: 50px ;
}
.logo-container img {
width: 100px ;
}
.message-container {
height: 80px ;
}
.link-container {
height: 40px ;
line-height: 40px ;
}
.link-container a {
text-decoration: none ;
}
</style>
</head>
<body>
<div class="container form-container">
<form action="/wendao/regist.do" method="post">
<div class="form"> <!-- -->
<div class="form-row">
<span class="cell-1">
<i class="fa fa-user"></i>
</span>
<span class="cell-11" style="text-align: left;">
<input type="text" name="username" placeholder=" ">
</span>
</div>
<div class="form-row">
<span class="cell-1">
<i class="fa fa-key"></i>
</span>
<span class="cell-11" style="text-align: left;">
<input type="password" name="password" placeholder=" ">
</span>
</div>
<div class="form-row">
<span class="cell-1">
<i class="fa fa-keyboard-o"></i>
</span>
<span class="cell-11" style="text-align: left;">
<input type="password" name="confirm" placeholder=" ">
</span>
</div>
<div class="form-row">
<span class="cell-7">
<input type="text" name="verifyCode" placeholder=" ">
</span>
<span class="cell-5" style="text-align: center;">
<img src="/demo/verify/regist.do" onclick="myRefersh(this)">
</span>
</div>
<div class="form-row" style="border: none;">
<span class="cell-6" style="text-align: left">
<input type="reset" value=" ">
</span>
<span class="cell-6" style="text-align:right;">
<input type="submit" value=" ">
</span>
</div>
</div> <!-- -->
</form>
</div>
</body>
</html>
효 과 는 다음 그림 과 같 습 니 다:페이지 리 셋 을 누 르 면 인증 코드 도 달라 지지 만 인증 코드 가 잘 보이 지 않 을 때 인증 코드 를 누 르 면 리 셋 됩 니 다.이렇게 부분 적 인 리 셋 은 자바 스 크 립 트 로 이 루어 집 니 다.
에 물음표 와 접미사 숫자 를 추가 합 니 다.새로 고침 할 때 접미사 숫자 가 계속 바 뀌 면 형 성 된 인증 코드 도 계속 변화 합 니 다.우리 가 사용 할 수 있 는 방법 은 접미사 숫자 를 date 로 대체 하 는 것 입 니 다.date 가 이 컴퓨터 의 시간 을 가 져 오 는 것 입 니 다.시간 은 수시로 변 합 니 다.그러면 새로 고침 인증 코드 가 수시로 변 할 수 있 습 니 다.
코드 는 다음 과 같 습 니 다:
function myRefersh( e ) {
const source = e.src ; // src
//console.log( "source : " + source ) ;
var index = source.indexOf( "?" ) ; // source ? ( -1 )
//console.log( "index : " + index ) ;
if( index > -1 ) { // ?
var s = source.substring( 0 , index ) ; // source index ( index index )
//console.log( "s : " + s ) ;
var date = new Date(); // Date
var time = date.getTime() ; // Date
e.src = s + "?time=" + time ; // src
//console.log( e.src ) ;
} else {
var date = new Date();
e.src = source + "?time=" + date.getTime();
}
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.