基于servlet的验证码和md5加密

前言

验证码通俗的讲就是为了防止机器人自动注册无限制,而md5加密则将明文密码转化为一个32位字符串

验证码

这里是基于servlet的,也就是说通过java代码随机生成一个你设置的位数的字符串,然后将其保存在session中,以便后续是通过ajax传给前台验证或者是后台验证
首先是生成验证码的类,这里我放在了com.ltw.tools包下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
public class yanzhengma extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 7.禁止浏览器缓存随机图片
response.setDateHeader("Expires", -1);
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
// 6.通知客户机以图片方式打开发送过去的数据
response.setHeader("Content-Type", "image/jpeg");
// 1.在内存中创建一副图片
BufferedImage image = new BufferedImage(60, 30,
BufferedImage.TYPE_INT_RGB);
// 2.向图片上写数据
Graphics g = image.getGraphics();
// 设背景色
g.setColor(Color.BLACK);
g.fillRect(0, 0, 60, 30);
// 3.设置写入数据的颜色和字体
g.setColor(Color.RED);
g.setFont(new Font(null, Font.BOLD, 20));
// 4.向图片上写数据
String num = makeNum();
//这句话就是把随机生成的数值,保存到session,
//通过session就可以直接去到随即生成的验证码了
request.getSession().setAttribute("checkcode", num); g.drawString(num, 0, 20);
// 5.把写好数据的图片输出给浏览器
ImageIO.write(image, "jpg", response.getOutputStream());
}
//该函数时随机生成7位数字
public String makeNum() {
Random r = new Random();
//9999999 可以生成7位
String num = r.nextInt(99999) + "";
StringBuffer sb = new StringBuffer();
//如果不够4位,前面补零
for (int i = 0; i < 5 - num.length(); i++) {
sb.append("0");
}
num = sb.toString() + num;
return num;
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {}
}

这里需要注意的是随机生成的数字放在session的checkcode中,通过设置r.nextInt(xxx),xxx表示生成几位,如9999,则为四位验证码,然后在for循环中改成设置的位即可
接下来将验证码映射成资源文件,在web.xml中设置

1
2
3
4
5
6
7
8
9
<servlet>
<servlet-name>yanzhengma</servlet-name>
<servlet-class>com.ltw.tools.yanzhengma</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>yanzhengma</servlet-name>
<url-pattern>/yanzhengma</url-pattern>
</servlet-mapping>

这样该类就被映射成一个资源,然后在页面中直接取资源

1
2
3
4
<input type="text" name="yanzhenma" placeholder="请输入验证码" required="required">
<!-- 验证码,后台已将该.java映射为文件 -->
<img src='/项目名/yanzhengma' style="width:400px;height: 50px;" >
<input id="submit" type="submit" value="登录">

如果这里我们需要在前台输入验证码验证,可以通过ajax传值验证。
然后在写一个servlet用来将checkcode转换为json传给前台

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class dengluyanzhen extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String code = (String) request.getSession().getAttribute("checkcode"); //获得验证码
response.setContentType("text/html; charset=UTF-8");
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
PrintWriter out = response.getWriter();
StringBuffer sb = new StringBuffer();
sb.append(code);
out.write(sb.toString()); //转化为json格式将验证码返回给前端
out.close();
}
}

然后在前台,还是上面那个页面增加如下代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<script type="text/javascript">
$(function(){
/* 利用ajax异步传值,result获得后台传过来的json数据,即验证码 */
var result = "";
$.ajax({
url:'<%=path%>/dengluyanzhen',
type:"POST",
dataType:"json",
async:true,//关闭异步加载,这样只有加载完成才进行下一步
success:function (data) {
result = data;
}
});
$("#submit").click(function () {
var num1=$("[name='yanzhenma']").val();
if(result!=num1){
alert("您输入的验证码不一致!请重新输入");
return false;
window.location.href="error.jsp";
}
});
});
</script>

MD5加密

主要是一个算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class MD5 {
public final static String MD5(String s) {
char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9','a', 'b', 'c', 'd', 'e', 'f' };
try {
byte[] strTemp = s.getBytes();
MessageDigest mdTemp = MessageDigest.getInstance("MD5");
mdTemp.update(strTemp);
byte[] md = mdTemp.digest();
int j = md.length;
char str[] = new char[j * 2];
int k = 0;
for (int i = 0; i < j; i++) {
byte byte0 = md[i];
str[k++] = hexDigits[byte0 >>> 4 & 0xf];
str[k++] = hexDigits[byte0 & 0xf];
}
return new String(str);
} catch (Exception e) {
return null;
}
}
}

如果我们想要将一个字符加密,直接调用该类的静态方法即可,如
MD5.MD5(users.getPwd())。

热评文章