자바 웹 인증 코드 기능 구현(demo)
DEMO 목표 기능
페이지:demo1.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title> </title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<style type="text/css">
img {
width: 87px;
height: 33px;
border: 1px solid gray;
}
#msg {color: red;} /* */
</style>
</head>
<body>
<form action="${pageContext.request.contextPath}/check" method="post" enctype="application/x-www-form-urlencoded">
:<input type="text" name="code" size="4" maxlength="4" id="code" />
<img id="code-img" src="" alt=" " style="display: none;"/>
<a href="javascript:void(0)" rel="external nofollow" id="changeCode"> ? </a> <br/><br/>
<input type="submit" value=" "/> <span id="msg">${msg}</span>
</form>
</body>
</html>
설명:"잘 안 보 여요?"바 꾸 기"의 href 속성
javascript:void(0)
은 페이지 새로 고침 을 방지 하기 위해 서 입 니 다.이곳 의 바 꾸 기 기능 은 AJAX 비동기 에 맡 깁 니 다.JavaScript 도구:util.js(왜 원생 JS 를 사용 합 니까?제멋대로 지~하)
/**
* XMLHttpRequest Object
* @returns XMLHttpRequest Object
*/
function getXHR() {
var xmlHttp;
try { // Firefox, Opera 8.0+, Safari
xmlHttp = new XMLHttpRequest();
} catch (e) { // Internet Explorer
try {
xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {
alert("Sorry, AJAX!");
return false;
}
}
}
return xmlHttp;
}
페이지 의 JavaScript 코드
<script type="text/javascript" src="${pageContext.request.contextPath}/js/util.js"></script>
<script type="text/javascript">
var xhr = getXHR(); // XMLHttpRequest
// ,
window.onload=function() {
// onreadystatechange 。 xhr ,
xhr.onreadystatechange=function() {
if(xhr.readyState==4 && xhr.status==200) {
document.getElementById('code-img').src="data:image/png;base64,"+xhr.responseText;
}
}
xhr.open("GET","${pageContext.request.contextPath}/captcha/code",true);
xhr.send(null);
}
// ,
document.getElementById('code').onfocus=function() {
document.getElementById('code-img').style.display="inline";
}
// ,
document.getElementById('changeCode').onclick=function() {
xhr.open("GET","${pageContext.request.contextPath}/captcha/code",true);
xhr.send(null);
}
</script>
인증 코드 를 만 드 는 CaptchaCodeServlet.자바
package com.leo.web.captcha;
import java.io.IOException;
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 com.leo.util.ImageUtil;
import cn.dsna.util.images.ValidateCode;
@WebServlet("/captcha/code")
public class CaptchaCodeServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
// ( : , , , )
ValidateCode code = new ValidateCode(87, 33, 4, 23);
// session ,
request.getSession().setAttribute("code", code.getCode());
// base64
response.getWriter().write(ImageUtil.encodeImg2Base64(code.getBuffImg(), "png"));
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
this.doGet(request, response);
}
}
설명:여기에
Servlet3.0
의 새로운 특성 을 사 용 했 습 니 다.-주해 로 설정 url-pattern
(사용 하면 시원 합 니 다),즉 간단 한 항목 은 더 이상web.xml
이 필요 하지 않 지만Tomcat
은 7.0+가 필요 합 니 다.그 다음 에 인증 코드 를 만 드 는 데 작은 도 구 를 사 용 했 습 니 다.ValidateCode.jar도 구 는 매우 간단 해서 마음 에 들 지 않 으 면 스스로 쓸 수 있다.그러나 기능 이 너무 적어 서 나 는 또 하나 썼 다
ImageUtil
.나 도 스스로 인증 코드 도 구 를 만들어 낼 계획 이다.ImageUtil.java
package com.leo.util;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import javax.imageio.ImageIO;
import sun.misc.BASE64Encoder;
public class ImageUtil {
/**
* base64
* @param bufImg
* @return base64
*/
public static String encodeImg2Base64(BufferedImage bufImg, String formatName) {
ByteArrayOutputStream outputStream = null;
try {
outputStream = new ByteArrayOutputStream();
ImageIO.write(bufImg, formatName, outputStream);
} catch (IOException e) {
throw new RuntimeException("Base64 !"+e.getMessage());
}
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(outputStream.toByteArray());
}
private ImageUtil() {} //
}
설명:왜 그림 바 이 너 리 데 이 터 를 Base 64 인 코딩 합 니까?
<img/>
탭 은 속성 값src
을${pageContext.request.contextPath}/captcha/code
으로 직접 설정 하여 바 이 너 리 데 이 터 를 직접 표시 하도록 요청 할 수 있 지만,AJAX 비동기 요청 에서 응답 한 것 은xhr.responseText
이기 때문이다.데 이 터 를 img
탭 의 src
속성 에 직접 줄 때 Chrome-tool
으로 보면 바 이 너 리 를 텍스트 로 해석 하 는 어 지 러 운 문자 로 만 볼 수 있 기 때문에 이 단 계 를 더 해 야 합 니 다.어쩌면 나 는 몽 신 으로서 다른 편리 한 기 교 를 모 를 지도 모른다.그러나 이 보 를 사용 하지 않 으 려 면 직접
img src
요청 주소 로 설정 하 는 것 이 가장 쉬 운 선택 입 니 다.인증 코드 를 바 꾸 는 것 은 감청 이벤트 img src
가 이 주소 로 다시 설정 하 는 것 이 아 닙 니 다(다시 요청).상세 한 자료:JS 브 라 우 저 에서 Base 64 인 코딩 그림 분석
Base 64 이미지 인 코딩 분석 및 브 라 우 저의 호환성 처리
백그라운드 인증 코드:CheckServlet.jave
package com.leo.web.controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/check")
public class CheckServlet extends HttpServlet {
private static final long serialVersionUID = -6588625852621588221L;
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
String encoding = "UTF-8";
request.setCharacterEncoding(encoding);
response.setContentType("text/html;charset="+encoding);
/* */
String inputCode = request.getParameter("code");
// session
String realCode = (String) request.getSession().getAttribute("code");
System.out.println("input: "+inputCode+"
real: "+realCode); // Debug
if(!(inputCode!=null && realCode!=null &&
inputCode.equalsIgnoreCase(realCode))) {
// :
request.setAttribute("msg", " ! ");
request.getRequestDispatcher("/demo1.jsp").forward(request, response);
return;
}
// , OK
response.getWriter().write(" !");
}
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
doGet(request, response);
}
}
설명:doGet()방법 은 처음에는 중국어 난 코드 를 처리 하고 인 코딩 은 UTF-8 로 통일 적 으로 설정 합 니 다.실제 프로젝트 에서 인 코딩 문 제 는 보통 하나의 Filter 에 맡 겨 완성 하여 영원히 편안 한 효 과 를 얻는다.
효과.
경고!경고!!얼굴 컨트롤 빨리 철수 하 세 요!!
마지막 에 쓰다
이상 은 자바 웹 인증 코드 작은 DEMO 의 모든 내용 입 니 다.인증 제출 도 비동기 로 하 는 것 이 좋 습 니 다.여 기 는 정돈 되 지 않 습 니 다.WEB 프로젝트 에서 인증 코드 기능 을 추가 해 본 적 이 없 는 파트너 가 시작 할 수 있 습 니 다!실제 프로젝트 에 서 는 JQuery 등 프레임 워 크 를 이용 해 AJAX 를 처리 하고 예 쁜 전단 페이지 를 하나 더 매치 하면 완벽 하 다.
위 에서 말 한 것 은 소 편 이 소개 한 자바 웹 이 인증 코드 기능 을 실현 하 는 것 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 메 시 지 를 남 겨 주세요.소 편 은 제때에 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Javaweb에서 양식 데이터를 가져오는 다양한 방법Javaweb에서 양식 데이터를 가져오는 몇 가지 방법 1. 키 값이 맞는 형식으로 폼 데이터를 얻는다 getParameter(String name): 키를 통해 value를 반환합니다. getParameterVal...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.