java springmvc验证码_Spring mvc 验证码的做法

第二:后端代码编写

代码:

@Controller

@RequestMapping("/VerificationCode")

public class VerificationCodeController extends HttpServlet{

private static final long serialVersionUID = 1L;

/**

* 这里用作存入session的名称

*/

private static final String SESSION_KEY_OF_RAND_CODE = "randCode"; // 定义一个存入全局变量中的session的名字

/**

* 随机产生干扰线,就是前端页面显示的小点点的个数

*/

private static final int count = 200;

/**

* 定义图形大小(宽)

*/

private static final int width = 105;

/**

* 定义图形大小(高)

*/

private static final int height = 35;

/**

* 干扰线的长度=1.414*lineWidth

*/

private static final int lineWidth = 1;

@RequestMapping(value = "/generate", method = { RequestMethod.POST,

RequestMethod.GET })

public void VerificationCode( HttpServletRequest request,

HttpServletResponse response) throws ServletException,

IOException {

// 设置页面不缓存

response.setHeader("Pragma", "No-cache");

response.setHeader("Cache-Control", "no-cache");

response.setDateHeader("Expires", 0);

// response.setContentType("image/png");  这个根据项目配置环境自由设置,这个方法中没用到

// 在内存中创建图象

final BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

// 获取图形上下文

final Graphics2D graphics = (Graphics2D) image.getGraphics();

// 设定背景颜色

graphics.setColor(Color.WHITE); // ---1.Color.WHITE为白色

graphics.fillRect(0, 0, width, height);//填充衍射

// 设定边框颜色

//graphics.setColor(getRandColor(100, 200)); // ---2.这是以数字型来设置颜色,颜色模式是指使用三种基色:红、绿、蓝,通过三种颜色的调整得出其它各种颜色,这三种基色的值范围为0~255

graphics.drawRect(0, 0, width - 1, height - 1);

final Random random = new Random();

// 随机产生干扰线,使图象中的认证码不易被其它程序探测到

for (int i = 0; i < count; i++) {

graphics.setColor(getRandColor(150, 200)); // ---3.

final int x = random.nextInt(width - lineWidth - 1) + 1; // 保证画在边框之内

final int y = random.nextInt(height - lineWidth - 1) + 1;

final int xl = random.nextInt(lineWidth);

final int yl = random.nextInt(lineWidth);

graphics.drawLine(x, y, x + xl, y + yl);

}

// 取随机产生的认证码(4位数字)

final String resultCode = exctractRandCode();

for (int i = 0; i < resultCode.length(); i++) {

// 将认证码显示到图象中,调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成

// graphics.setColor(new Color(20 + random.nextInt(130), 20 + random

// .nextInt(130), 20 + random.nextInt(130)));

// 设置字体颜色

graphics.setColor(Color.BLACK);

// 设置字体样式

//graphics.setFont(new Font("Arial Black", Font.ITALIC, 18));

graphics.setFont(new Font("Times New Roman", Font.BOLD, 24));

// 设置字符,字符间距,上边距

System.out.print(resultCode.charAt(i));

graphics.drawString(String.valueOf(resultCode.charAt(i)), (23 * i) + 8, 26);

}

System.out.println("直接输出:"+resultCode);

// 将认证码存入SESSION

request.getSession().setAttribute(SESSION_KEY_OF_RAND_CODE, resultCode);

// 图象生效

graphics.dispose();

// 输出图象到页面

ImageIO.write(image, "JPEG", response.getOutputStream());

}

/**

* @return 随机码

*/

private String exctractRandCode() {

final String randCodeType = ResourceUtil.getRandCodeType();

int randCodeLength = Integer.parseInt(ResourceUtil.getRandCodeLength());

if (randCodeType == null) {

return RandCodeImageEnum.NUMBER_CHAR.generateStr(randCodeLength);

} else {

switch (randCodeType.charAt(0)) {

case '1':

return RandCodeImageEnum.NUMBER_CHAR.generateStr(randCodeLength);

case '2':

return RandCodeImageEnum.LOWER_CHAR.generateStr(randCodeLength);

case '3':

return RandCodeImageEnum.UPPER_CHAR.generateStr(randCodeLength);

case '4':

return RandCodeImageEnum.LETTER_CHAR.generateStr(randCodeLength);

case '5':

return RandCodeImageEnum.ALL_CHAR.generateStr(randCodeLength);

default:

return RandCodeImageEnum.NUMBER_CHAR.generateStr(randCodeLength);

}

}

}

/**

* 描述:根据给定的数字生成不同的颜色

* @param 这是以数字型来设置颜色,颜色模式是指使用三种基色:红、绿、蓝,通过三种颜色的调整得出其它各种颜色,这三种基色的值范围为0~255

* @param 这是以数字型来设置颜色,颜色模式是指使用三种基色:红、绿、蓝,通过三种颜色的调整得出其它各种颜色,这三种基色的值范围为0~255

* @return 描述:返回颜色

*/

private Color getRandColor(int fc, int bc) { // 取得给定范围随机颜色

final Random random = new Random();

if (fc > 255) {

fc = 255;

}

if (bc > 255) {

bc = 255;

}

final int r = fc + random.nextInt(bc - fc);

final int g = fc + random.nextInt(bc - fc);

final int b = fc + random.nextInt(bc - fc);

return new Color(r, g, b);

}

/**

* 验证码辅助类

*

* @author 张国明 guomingzhang2008@gmail.com 

*         2012-2-28 下午2:15:14

*

*/

enum RandCodeImageEnum {

/**

* 混合字符串

*/

ALL_CHAR("0123456789abcdefghijkmnpqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), // 去除小写的l和o这个两个不容易区分的字符;

/**

* 字符

*/

LETTER_CHAR("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"),

/**

* 小写字母

*/

LOWER_CHAR("abcdefghijklmnopqrstuvwxyz"),

/**

* 数字

*/

NUMBER_CHAR("0123456789"),

/**

* 大写字符

*/

UPPER_CHAR("ABCDEFGHIJKLMNOPQRSTUVWXYZ");

/**

* 待生成的字符串

*/

private String charStr;

/**

* @param charStr

*/

private RandCodeImageEnum(final String charStr) {

this.charStr = charStr;

}

/**

* 生产随机验证码

*

* @param codeLength

*            验证码的长度

* @return 验证码

*/

public String generateStr(final int codeLength) {

final StringBuffer sb = new StringBuffer();

final Random random = new Random();

final String sourseStr = getCharStr();

for (int i = 0; i < codeLength; i++) {

sb.append(sourseStr.charAt(random.nextInt(sourseStr.length())));

}

return sb.toString();

}

/**

* @return the {@link #charStr}

*/

public String getCharStr() {

return charStr;

}

}

}

/**

* 项目参数工具类

*

*/

public class ResourceUtil {

private static final ResourceBundle bundle = java.util.ResourceBundle.getBundle("sysConfig");

/**

* 获取随机码的长度

*

* @return 随机码的长度

*/

public static String getRandCodeLength() {

return bundle.getString("randCodeLength");

}

/**

* 获取随机码的类型

*

* @return 随机码的类型

*/

public static String getRandCodeType() {

return bundle.getString("randCodeType");

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值