public class CheckCode extends HttpServlet {
public static final int WIDTH=90;
public static final int HEIGHT=30;
private String checkcode;
public static final char[] CHARS={'2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','J','K','L','M','N','P','Q','R','S','T','U','V','W','X','Y','Z'};
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
BufferedImage image=new BufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_INT_RGB);
//获取绘画实例
Graphics g=image.getGraphics();
//1.设置前景色
setBackGround(g);
//2.设置边框
setBorder(g);
//3.画干扰线
drawRandomLine(g);
//4.写随机数
checkcode=drawRandomNum(g);
//5、用session将验证码保存起来,如进行验证时,会在spring security自定义的登录验证MyUsernamePasswordAuthenticationFilter类里进行验证
if(request.getSession().getAttribute("validateCode")!=""){
request.getSession().removeAttribute("validateCode");
request.getSession().setAttribute("validateCode", checkcode);
}else{
request.getSession().setAttribute("validateCode", checkcode);
}
//5.图形写给浏览器
response.setContentType("IMAGE/jpeg");
//浏览器不缓存
response.setDateHeader("expires", -1);
response.setHeader("Cache-Control", "no-cache");
response.setHeader("pragma", "no-cache");
ImageIO.write(image, "jpg", response.getOutputStream());
}
private void setBackGround(Graphics g) {
g.setColor(Color.WHITE);
g.fillRect(0, 0, WIDTH, HEIGHT);
}
private void setBorder(Graphics g) {
g.setColor(Color.BLUE);
g.drawRect(1, 1, WIDTH-3,HEIGHT-3);
}
private void drawRandomLine(Graphics g) {
g.setColor(Color.GREEN);
for(int i=0;i<5;i++){
int x1=new Random().nextInt(WIDTH);
int y1=new Random().nextInt(HEIGHT);
int x2=new Random().nextInt(WIDTH);
int y2=new Random().nextInt(HEIGHT);
g.drawLine(x1, y1, x2, y2);
}
}
private String drawRandomNum(Graphics g) {
g.setColor(Color.RED);
g.setFont(new Font("宋体",Font.BOLD,20));
Random random =new Random();
StringBuffer buffer=new StringBuffer();
for(int i=0;i<4;i++){ //生成六个字符
buffer.append(CHARS[random.nextInt(CHARS.length)]);
}
System.out.println("checkcode:"+buffer.toString());//测试用
g.drawString(buffer.toString(),22,22);
return buffer.toString();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
public String getCheckcode() {
return checkcode;
}
public void setCheckcode(String checkcode) {
this.checkcode = checkcode;
}
}
<pre name="code" class="java">web.xml 配置
<!-- 登录验证码的servlet -->
<servlet>
<servlet-name>CheckCode</servlet-name>
<servlet-class>framework.util.CheckCode</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CheckCode</servlet-name>
<url-pattern>/servlet/CheckCode</url-pattern>
</servlet-mapping>
<pre name="code" class="java">jsp 前端 和js
<script type="text/javascript">
function changeValidateImg() {
document.getElementById('validateImg').src='/项目名/servlet/CheckCode?t='+new Date().getTime();
}
</script>
<input id="validateCode" name="validateCode" type="text" id="vCode" style="width:118px;" tabindex="3" maxlength="4" />
<span style="margin:20px;">
<img id="validateImg" alt="无法显示验证码" src="/项目名称/servlet/CheckCode" οnclick="changeValidateImg();return false;"/>
<a href="javascript:void(0);" οnclick="changeValidateImg();return false;">换一张</a>
</span>