You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
202 lines
6.2 KiB
202 lines
6.2 KiB
package com.spring.controller;
|
|
|
|
import org.springframework.stereotype.Controller;
|
|
import org.springframework.web.bind.annotation.RequestMapping;
|
|
import util.DESUtil;
|
|
|
|
import javax.imageio.ImageIO;
|
|
import javax.servlet.ServletOutputStream;
|
|
import javax.servlet.http.HttpSession;
|
|
import java.awt.*;
|
|
import java.awt.image.BufferedImage;
|
|
import java.io.ByteArrayOutputStream;
|
|
import java.io.DataOutputStream;
|
|
import java.io.IOException;
|
|
import java.io.OutputStream;
|
|
import java.nio.ByteBuffer;
|
|
import java.util.Base64;
|
|
import java.util.Random;
|
|
|
|
/**
|
|
* 验证码控制器
|
|
*/
|
|
@Controller
|
|
public class CaptchaController extends BaseController {
|
|
/**
|
|
* 输出验证码图片,并记录session “random” 里等待登录时写入
|
|
*/
|
|
@RequestMapping("/captcha")
|
|
public String Index()
|
|
{
|
|
// 把验证码字符串写入session 中,保存待下次验证时使用
|
|
String sRand = createRandomString(4);
|
|
|
|
try {
|
|
// 输出渲染好的内容到前端浏览器
|
|
if(isAjax()){
|
|
String result = null;
|
|
do {
|
|
try{
|
|
result = DESUtil.encrypt("CaptchControllerPassword",sRand);
|
|
}catch (Exception e){
|
|
result = null;
|
|
}
|
|
if(result!= null){
|
|
if(!sRand.equals(DESUtil.decrypt("CaptchControllerPassword" , result))){
|
|
result = null; // 解不出来所以出错
|
|
}
|
|
}
|
|
}while (result == null);
|
|
|
|
assign("url" , "/randtocaptch?captchToken="+ urlencode(result));
|
|
assign("token" , result);
|
|
return json();
|
|
}else{
|
|
//byte[] img = xxx;
|
|
response.setContentType("image/jpeg"); // 定义输出类型为 图片
|
|
response.setHeader("Pragma","No-cache"); // 设置为无缓存
|
|
response.setHeader("Cache-Control","no-cache"); // 设置为无缓存
|
|
response.setDateHeader("Expires", 0); // 设置缓存时间为0秒后过期
|
|
request.getSession().setAttribute("random",sRand);
|
|
ServletOutputStream stream = response.getOutputStream();
|
|
createCaptch(sRand,stream);
|
|
stream.flush();
|
|
stream.close();
|
|
}
|
|
}catch (Exception e){
|
|
e.printStackTrace();
|
|
}
|
|
return "success";
|
|
}
|
|
|
|
|
|
/**
|
|
* url 编码,中文要进行编码输出
|
|
* @param str
|
|
* @return
|
|
*/
|
|
public static String urlencode(Object str)
|
|
{
|
|
try{
|
|
return java.net.URLEncoder.encode(String.valueOf(str), "UTF-8");
|
|
}catch (Exception e){
|
|
e.printStackTrace();
|
|
}
|
|
return str.toString();
|
|
}
|
|
|
|
/**
|
|
* 使用上面的加密字符串生成验证码
|
|
* @return
|
|
*/
|
|
@RequestMapping("/randtocaptch")
|
|
public String getCaptch() throws IOException {
|
|
String captchToken = request.getParameter("captchToken");
|
|
String sRand = DESUtil.decrypt("CaptchControllerPassword" , captchToken);
|
|
HttpSession session = request.getSession();
|
|
{
|
|
//byte[] img = xxx;
|
|
response.setContentType("image/jpeg"); // 定义输出类型为 图片
|
|
response.setHeader("Pragma","No-cache"); // 设置为无缓存
|
|
response.setHeader("Cache-Control","no-cache"); // 设置为无缓存
|
|
response.setDateHeader("Expires", 0); // 设置缓存时间为0秒后过期
|
|
ServletOutputStream stream = response.getOutputStream();
|
|
createCaptch(sRand,stream);
|
|
stream.flush();
|
|
stream.close();
|
|
}
|
|
return "success";
|
|
}
|
|
|
|
|
|
private String createRandomString(int len)
|
|
{
|
|
// 生成随机数类
|
|
Random random = new Random();
|
|
String result = "";
|
|
for (int i=0;i<len;i++){
|
|
String rand = String.valueOf(random.nextInt(10));
|
|
result += rand;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
private void createCaptch(String randomstr , OutputStream stream)
|
|
{
|
|
int width=60, height=20; // 定义图片宽为 60 高度为 20
|
|
|
|
// 创建图片缓冲区
|
|
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
|
|
|
|
// 获取渲染画板
|
|
Graphics g = image.getGraphics();
|
|
|
|
// 生成随机数类
|
|
Random random = new Random();
|
|
|
|
// 设置颜色
|
|
g.setColor(getRandColor(200,250));
|
|
|
|
// 绘制矩形
|
|
g.fillRect(0, 0, width, height);
|
|
|
|
// 设置字体信息
|
|
g.setFont(new Font("Times New Roman",Font.PLAIN,18));
|
|
|
|
// 设置颜色信息
|
|
g.setColor(getRandColor(160,200));
|
|
|
|
// 写入干扰线
|
|
for (int i=0;i<155;i++)
|
|
{
|
|
int x = random.nextInt(width);
|
|
int y = random.nextInt(height);
|
|
int xl = random.nextInt(12);
|
|
int yl = random.nextInt(12);
|
|
g.drawLine(x,y,x+xl,y+yl);
|
|
}
|
|
|
|
// 写入验证码字符串
|
|
for (int i=0;i<randomstr.length();i++){
|
|
String rand = randomstr.substring(i,i+1); //String.valueOf(random.nextInt(10));
|
|
|
|
g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));
|
|
g.drawString(rand,13*i+6,16);
|
|
}
|
|
g.dispose(); // 释放画板
|
|
|
|
try {
|
|
// 输出渲染好的内容到前端浏览器
|
|
|
|
ImageIO.write(image, "JPEG", stream);
|
|
stream.flush();
|
|
stream.close();
|
|
|
|
}catch (Exception e){
|
|
e.printStackTrace();
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
* 获取随机颜色
|
|
* @param fc
|
|
* @param bc
|
|
* @return
|
|
*/
|
|
protected Color getRandColor(int fc, int bc)
|
|
{
|
|
Random random = new Random();
|
|
if(fc>255) fc=255;
|
|
if(bc>255) bc=255;
|
|
int r=fc+random.nextInt(bc-fc);
|
|
int g=fc+random.nextInt(bc-fc);
|
|
int b=fc+random.nextInt(bc-fc);
|
|
return new Color(r,g,b);
|
|
}
|
|
}
|