SSM带验证码登录

登陆的时候有的需要带验证码连同用户名密码一同发送到后台校验,用户名和密码的校验我这个demo里面就不处理了,为了突出验证码部分,所以直接看验证码的校验就可以,验证通过控制台打印“用户输入的验证码和图片生成的验证码相等,登陆成功”。

JSP页面代码

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

<!DOCTYPE HTML>
<html lang="en">
<head>
<title>登录界面</title>
<script type="text/javascript"
	src="${pageContext.request.contextPath}/static/jquery/jquery-1.9.1.min.js"></script>
<script
	src="${pageContext.request.contextPath}/static/bootstrap-3.3.5/js/bootstrap.min.js"></script>
<link rel="stylesheet"
	href="${pageContext.request.contextPath}/static/bootstrap-3.3.5/css/bootstrap-theme.css"></link>
<link rel="stylesheet"
	href="${pageContext.request.contextPath}/static/bootstrap-3.3.5/css/bootstrap.css"
	type="text/css"></link>


</head>
<body>

	<div class="login-content">
		<div class="login-title">
			<h1>登录</h1>
		</div>
		<div class="login">
			<form>
				<!-- <div>
					<div>
						<input id="username" type="text" name="username" placeholder="用户名" />
					</div>

				</div>
				<div>
					<div>
						<input id="pwd" type="password" name="password" placeholder="密码" />
					</div>
				</div> -->
				<div>
					<input type="text" id="user_input_verifyCode"
						name="user_input_verifyCode" placeholder="验证码" maxlength="4">

					<span class="code_img"> <img
						src="${pageContext.request.contextPath }/login/getVerifyCode"
						width="110" height="40" id="verifyCodeImage">
					</span> <span> <a id="changeVerifImageRegister"
						οnclick="javascript:changeImage();">换一张</a>
					</span>

				</div>
				<input id="submit" type="button" value="登录" οnclick="login()">
			</form>



		</div>
	</div>
	<script type="text/javascript">
	function genTimestamp() {    
        var time = new Date();    
        return time.getTime();    
    } 
	 function changeImage() {
         $('#verifyCodeImage').attr('src',
                 '${pageContext.request.contextPath }/login/getVerifyCode?timestamp=' + genTimestamp());
     }
	 //登录,目前只检测验证码
	 function login(){
		 var user_input_verifyCode=$("#user_input_verifyCode").val();
		 $.ajax({
				type : 'post',
				url : "${pageContext.request.contextPath}/login/login",
				data:{verifyCode:user_input_verifyCode},
				//dataType : "json",
				success : function(data) {	
					
				},
				error : function() {
					alert("查询失败");
				}
			}); 
	 }
	
	 </script>
</body>
</html>

Controller代码:注意的是,当访问登录界面的时候就会自动加载验证码图片,同时把验证码值存入session中,当我们处理登录逻辑的时候是通过前端输入的验证码值和从session中存储的图片中的验证码值来进行比较进行校验的。

package com.wonders.controller;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.font.FontRenderContext;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

/**
 * 登录功能
 */
@Controller
@RequestMapping("/login")
public class LoginController {
	// http://localhost:8080/ssmmaven/login/showLoginView
	@RequestMapping("/showLoginView")
	public ModelAndView getIndex() {
		ModelAndView mv = new ModelAndView();
		mv.setViewName("login");
		return mv;
	}

	/**
	 * 获取验证码
	 * 
	 * @param response
	 * @param session
	 */
	@RequestMapping("/getVerifyCode")
	public void generate(HttpServletResponse response, HttpSession session) {
		ByteArrayOutputStream output = new ByteArrayOutputStream();
		String verifyCodeValue = drawImg(output);

		session.setAttribute("verifyCodeValue", verifyCodeValue);

		try {
			ServletOutputStream out = response.getOutputStream();
			output.writeTo(out);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 绘画验证码
	 * 
	 * @param output
	 * @return
	 */
	private String drawImg(ByteArrayOutputStream output) {
		String code = "";
		// 随机产生4个字符
		for (int i = 0; i < 4; i++) {
			code += randomChar();
		}
		int width = 70;
		int height = 25;
		BufferedImage bi = new BufferedImage(width, height,
				BufferedImage.TYPE_3BYTE_BGR);
		Font font = new Font("Times New Roman", Font.PLAIN, 20);
		// 调用Graphics2D绘画验证码
		Graphics2D g = bi.createGraphics();
		g.setFont(font);
		Color color = new Color(66, 2, 82);
		g.setColor(color);
		g.setBackground(new Color(226, 226, 240));
		g.clearRect(0, 0, width, height);
		FontRenderContext context = g.getFontRenderContext();
		Rectangle2D bounds = font.getStringBounds(code, context);
		double x = (width - bounds.getWidth()) / 2;
		double y = (height - bounds.getHeight()) / 2;
		double ascent = bounds.getY();
		double baseY = y - ascent;
		g.drawString(code, (int) x, (int) baseY);
		g.dispose();
		try {
			ImageIO.write(bi, "jpg", output);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return code;
	}

	/**
	 * 随机参数一个字符
	 * 
	 * @return
	 */
	private char randomChar() {
		Random r = new Random();
		String s = "ABCDEFGHJKLMNPRSTUVWXYZ0123456789";
		return s.charAt(r.nextInt(s.length()));
	}

	/**
	 * 登录逻辑
	 */
	@RequestMapping("/login")
	public void login(HttpServletRequest request, HttpSession session) {
		String inputVerifyCode=request.getParameter("verifyCode");
		System.out.println("用户输入的验证码值------>"
				+ inputVerifyCode);
		String verifyCodeValue=(String) session.getAttribute("verifyCodeValue");
		System.out.println("Session中的验证码值------>"
				+ verifyCodeValue);
		if(verifyCodeValue.equals(inputVerifyCode.toUpperCase())){
			System.out.println("用户输入的验证码和图片生成的验证码相等,登陆成功");
		}
	}
}

效果如下:


  • 3
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值