SSM框架验证码登录

简介: 做个记录,供大家参考和自己以后学习学习,直接上代码。

做个记录,供大家参考和自己以后学习学习,直接上代码


验证码部分


jsp部分


    <div class="loginbody">
<div class="login-container">
  <div class="center">
       <img src="images/logo_login.png" />
              </div>
              <div class="space-6"></div>
              <div class="position-relative">
                <div id="login-box" class="login-box widget-box no-border visible">
                  <div class="widget-body">
                    <div class="widget-main">
                      <h4 class="header blue lighter bigger">
                        <i class="icon-coffee green"></i>
                        管理员登录
                      </h4>
                      <div class="login_icon"><img src="images/login.png" /></div>
                      <form class="login" id="login" action="admin/login" method="post">
                        <fieldset>
                    <ul>
   <li class="frame_style form_error"><label class="user_icon"></label><input name="name" value="${name}" type="text"  id="name" /><i>用户名</i></li>
   <li class="frame_style form_error"><label class="password_icon"></label><input name="password" value="${password}" type="password"   id="pwd"/><i>密码</i></li>
   <li class="frame_style form_error"><label class="Codes_icon"></label> <input name="code" type="text" id="Codes_text" class="auautocomplete=off"/><i>验证码</i><div class="Codes_region"><img src="images/yzm.jpg" style="width:80;height:35" id ="checkCode_img"/></div></li>
   <li><i><font color='red'>${error}</font></i></li>
  </ul>
                          <div class="space"></div>
                          <div class="clearfix">
                            <label class="inline">
                              <input type="checkbox" class="ace">
                              <span class="lbl">保存密码</span>
                            </label>
                            <button type="button" class="width-35 pull-right btn btn-sm btn-primary" id="login_btn">
                              <i class="icon-key"></i>
                              登录
                            </button>
                          </div>
                          <div class="space-4"></div>
                        </fieldset>
                      </form>


js代码


var getCodeUrl="/changeCode";//获取验证码的后端地址
$('#checkCode_img').attr('src',getCodeUrl+'?t='+ new Date().getTime()).show();//为了防止浏览器缓存上次的验证码
$('#checkCode_img').click(function(){this.src=getCodeUrl+'?t='+ new Date().getTime();});


Java代码


生成验证码工具类(此部分借用网上的代码,这位仁兄谢谢你了,当时博客链接没保存,不好意思啦,再次感谢


public class GenConfirmCodeUtil {
    public static final String RANDOMCODEKEY= "RANDOMCODEKEY";//放到session中的key
      private String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";//随机产生数字与字母组合的字符串
      private int width = 80;// 图片宽
      private int height = 35;// 图片高
      private int lineSize = 40;// 干扰线数量
      private int stringNum = 4;// 随机产生字符数量
      private Random random = new Random();
      /*
       * 获得字体
       */
      private Font getFont() {
          return new Font("Fixedsys", Font.CENTER_BASELINE, 18);
      }
      /*
       * 获得颜色
       */
      private Color getRandColor(int fc, int bc) {
          if (fc > 255)
              fc = 255;
          if (bc > 255)
              bc = 255;
          int r = fc + random.nextInt(bc - fc - 16);
          int g = fc + random.nextInt(bc - fc - 14);
          int b = fc + random.nextInt(bc - fc - 18);
          return new Color(r, g, b);
      }
      /**
       * 生成随机图片
       */
      public void getRandcode(HttpServletRequest request, HttpServletResponse response) {
          HttpSession session = request.getSession();
          // BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类
          BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
          Graphics g = image.getGraphics();// 产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作
          g.fillRect(0, 0, width, height);
          g.setFont(new Font("Times New Roman", Font.ROMAN_BASELINE, 20));
          g.setColor(getRandColor(110, 133));
          // 绘制干扰线
          for (int i = 0; i <= lineSize; i++) {
              drowLine(g);
          }
          // 绘制随机字符
          String randomString = "";
          for (int i = 1; i <= stringNum; i++) {
              randomString = drowString(g, randomString, i);
          }
          //将生成的随机字符串保存到session中,而jsp界面通过session.getAttribute("RANDOMCODEKEY"),
          //获得生成的验证码,然后跟用户输入的进行比较
          session.removeAttribute(RANDOMCODEKEY);
          session.setAttribute(RANDOMCODEKEY, randomString);
          g.dispose();
          try {
              // 将内存中的图片通过流动形式输出到客户端
              ImageIO.write(image, "JPEG", response.getOutputStream());
          } catch (Exception e) {
              e.printStackTrace();
          }
      }
      /*
       * 绘制字符串
       */
      private String drowString(Graphics g, String randomString, int i) {
          g.setFont(getFont());
          g.setColor(new Color(random.nextInt(101), random.nextInt(111), random
                  .nextInt(121)));
          String rand = String.valueOf(getRandomString(random.nextInt(randString
                  .length())));
          randomString += rand;
          g.translate(random.nextInt(3), random.nextInt(3));
          g.drawString(rand, 13 * i, 16);
          return randomString;
      }
      /*
       * 绘制干扰线
       */
      private void drowLine(Graphics g) {
          int x = random.nextInt(width);
          int y = random.nextInt(height);
          int xl = random.nextInt(13);
          int yl = random.nextInt(15);
          g.drawLine(x, y, x + xl, y + yl);
      }
      /*
       * 获取随机的字符
       */
      public String getRandomString(int num) {
          return String.valueOf(randString.charAt(num));
      }
}


Controller代码


@Controller
public class ConfirmCodeController {
    @RequestMapping(value = "/changeCode")
      public void getVerify(HttpServletRequest request, HttpServletResponse response){
          response.setContentType("image/jpeg");//设置相应类型,告诉浏览器输出的内容为图片
          response.setHeader("Pragma", "No-cache");//设置响应头信息,告诉浏览器不要缓存此内容
          response.setHeader("Cache-Control", "no-cache");
          response.setDateHeader("Expire", 0);
          GenConfirmCodeUtil codeUtil=new GenConfirmCodeUtil();
          try {
              codeUtil.getRandcode(request, response);//输出验证码图片方法
          } catch (Exception e) {
              e.printStackTrace();
          }
      }
}


登录的代码


ServiceImpl


@Service
public class LoginServiceImpl implements LoginService {
  @Autowired
  private TbAdminMapper adminMapper;
  @Override
  public TbAdmin login(String name) {
    TbAdminExample example=new TbAdminExample();
    Criteria criteria = example.createCriteria();
    criteria.andNameEqualTo(name);
    List<TbAdmin> admin = adminMapper.selectByExample(example);
    if(admin.size()>0&&admin!=null) {
      return admin.get(0);
    }
    return null;
  }
}


Controller


public class LoginController {
  @Autowired
  private LoginService loginService;
  @RequestMapping(value="/login",method=RequestMethod.POST)
  public String login(String name,String password,String code,HttpSession session) {
    //获取验证码
    String codeStr = (String) session.getAttribute("RANDOMCODEKEY");
    TbAdmin admin = loginService.login(name);
    try {
      if(code.equalsIgnoreCase(codeStr)) {
        if(admin!=null) {
          if(password.equals(admin.getPassword())) {
            session.setAttribute("admin", admin);
            return "index";
          }
        }
      }else {
         session.setAttribute("error","验证码错误");
               return "redirect:/login.jsp";
      }
    }catch(Exception e) {
      e.printStackTrace();
      session.setAttribute("error", "账号或密码错误");
      return "redirect:/login.jsp";
    }
    return null;        
  }
相关实践学习
【玩转ComfyUI】基于函数计算一键部署AI生图平台ComfyUI
本次实验将带大家通过使用阿里云产品函数计算FC,快速使用ComfyUI实现更高质量的图像生成。
从 0 入门函数计算
在函数计算的架构中,开发者只需要编写业务代码,并监控业务运行情况就可以了。这将开发者从繁重的运维工作中解放出来,将精力投入到更有意义的开发任务上。
相关文章
|
Java 数据库连接 Maven
手把手教你如何搭建SSM框架、图书商城系统案例
这篇文章是关于如何搭建SSM框架以及实现一个图书商城系统的详细教程,包括了项目的配置文件整合、依赖管理、项目结构和运行效果展示,并提供了GitHub源码链接。
手把手教你如何搭建SSM框架、图书商城系统案例
|
存储 NoSQL 数据库
认证服务---整合短信验证码,用户注册和登录 ,密码采用MD5加密存储 【二】
这篇文章讲述了在分布式微服务系统中添加用户注册和登录功能的过程,重点介绍了用户注册时通过远程服务调用第三方服务获取短信验证码、使用Redis进行验证码校验、对密码进行MD5加密后存储到数据库,以及用户登录时的远程服务调用和密码匹配校验的实现细节。
认证服务---整合短信验证码,用户注册和登录 ,密码采用MD5加密存储 【二】
|
11月前
|
SQL Java 数据库连接
2-SSM框架篇
Spring框架核心知识点总结,涵盖IOC、DI、Bean作用域、事务管理、AOP、Spring MVC流程及MyBatis相关问题。内容包括控制反转与依赖注入原理、Bean生命周期与线程安全、事务传播机制、JDK与CGLIB代理区别、MyBatis动态SQL与缓存机制等高频面试题。
213 0
|
前端开发 Java 数据库连接
Spring MVC 扩展和SSM框架整合
通过以上步骤,我们可以将Spring MVC扩展并整合到SSM框架中。这个过程包括配置Spring MVC和Spring的核心配置文件,创建控制器、服务层和MyBatis的Mapper接口及映射文件。在实际开发中,可以根据具体业务需求进行进一步的扩展和优化,以构建更加灵活和高效的企业级应用程序。
343 5
|
Java 关系型数据库 MySQL
ssm063基于SSM框架的德云社票务系统的设计与实现(文档+源码)_kaic
基于SSM框架的德云社票务系统旨在解决传统相声订票方式费时费力的问题,提供便捷的在线订票平台。系统采用Java技术、MySQL数据库,结合B/S架构,确保数据安全性和操作简便性。用户可轻松查询、预订相声票务信息,管理员则能高效管理票务和会员信息。该系统功能齐全、运行稳定,适用于现代信息化生活需求,有效提升德云社的票务管理效率与用户体验。
|
缓存 Java 应用服务中间件
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
4994 5
|
资源调度 JavaScript API
nest.js + sms 实现短信验证码登录
本文介绍了在Nest.js框架中集成短信验证码登录的实现方案,详细阐述了使用阿里云短信服务的配置流程、资质申请、短信模板设置,并提供了API调用示例和工程代码的运行步骤。
nest.js + sms 实现短信验证码登录
|
Java 数据库连接 Spring
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
文章是关于Spring、SpringMVC、Mybatis三个后端框架的超详细入门教程,包括基础知识讲解、代码案例及SSM框架整合的实战应用,旨在帮助读者全面理解并掌握这些框架的使用。
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
|
C#
C# 图形验证码实现登录校验代码
C# 图形验证码实现登录校验代码
637 2
|
Java
Java 登录输入的验证码
Java 登录输入的验证码
241 1

热门文章

最新文章