IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 基于layui框架的登录验证 -> 正文阅读

[JavaScript知识库]基于layui框架的登录验证

基于layui框架的登录验证

开发工具:idea,tomcat,ssm框架,以及引入的layui
一些关于框架的搭建在此略过,以后可能会发布一些相关文章layui现成的登录页面
这里只改变了背景图片,是一个现成的页面

//form表单部分代码
<form class="layui-form">
    <div class="login_face"><img src="/sources/lay/images/face.jpg" class="userAvatar"></div>
    <div class="layui-form-item input-item">
        <label for="userName">用户名</label>
        <input type="text" placeholder="请输入用户名" autocomplete="off" id="userName" name="username" class="layui-input" lay-verify="required">
    </div>
    <div class="layui-form-item input-item">
        <label for="password">密码</label>
        <input type="password" placeholder="请输入密码" autocomplete="off" id="password" name="password" class="layui-input" lay-verify="required">
    </div>
    <div class="layui-form-item input-item" id="imgCode">
        <label for="code">验证码</label>
        <input type="text" placeholder="请输入验证码" autocomplete="off" id="code" name="code" class="layui-input" lay-verify="required">
        <img src="/user/getcode" onclick="this.src=this.src+'?'" id="codehz">
    </div>
    <div class="layui-form-item">
        <button class="layui-btn layui-block" lay-filter="login" lay-submit>登录</button>
    </div>
</form>

???前端页面主要对三个框的name属性做了规范,以便controller入参自动封装,分别是username,password,和code
???首先编写了一个工具类ResultObject,用来封装校验后的结果信息,属性code大小表示查询状态,msg则是弹出信息提示,-1,0,1三种状态分别表示验证码错误,无此用户,用户查询成功

???这里编写controller,业务都在service里面处理

@Controller
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;
        /*登录验证*/
    @RequestMapping("/login")
    @ResponseBody
    public ResultObject login(UserVo user, HttpServletRequest request, HttpServletResponse response){
        ResultObject resultObject=userService.login(user, request, response);
        return resultObject;
    }
 /*获取验证码*/
    @RequestMapping("/getcode")
    public void getCode(HttpServletRequest request, HttpServletResponse response) throws IOException {
        userService.getCode(request,response );

    }

}

service代码

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserDao userDao;
    

    @Override
    public ResultObject login(UserVo user, HttpServletRequest request, HttpServletResponse response) {
       String code=user.getCode();//拿到验证码
        String session_code=request.getSession().getAttribute("code").toString();//拿到存储在服务器的校验验证码
        String msg="";
        Integer status_code=0;
        if(code.equals(session_code)){//验证码正确
            List<User> login = userDao.login(user);
            if(login.size()>0){
                msg="登陆成功";
                status_code=1;
            }else{
                msg="登陆失败";
                status_code=0;
            }
           
        }else {
            msg="验证码错误";
            status_code=-1;
        }
        /*将旧验证码失效*/
        request.getSession().setAttribute("code", "");

        ResultObject resultObject = new ResultObject(status_code,msg);
        return resultObject;
    }

    @Override
    public void getCode(HttpServletRequest request, HttpServletResponse response) throws IOException {
            /*生成验证码*/
        ICaptcha captcha= CaptchaUtil.createLineCaptcha(116, 36);
        /*把码值存放在session*/
        request.getSession().setAttribute("code",captcha.getCode() );
        /*图片回写到前端*/
        captcha.write(response.getOutputStream());
    }
}

???其中包括两个方法,分别对应controller中对service的调用,login方法拿到前台的用户数据,先与session中存放的验证码进行比较,一致后再进行数据库查询操作,最后返回一个ResultObject对象,包含用户登录状态,同时将session里存放的当前验证码设置失效(否则此验证码将长期有效,容易遭到破解),getcode方法则是直接参考链接的插件htool在这里插入图片描述
直接通过输出流将验证码图片返回前台

login前台对应的js文件

 //登录按钮
    form.on("submit(login)",function(data){
        var _this=$(this);
        $(this).text("登录中...").attr("disabled","disabled").addClass("layui-disabled");
       $.ajax({
           url:'/user/login',
           type:"get",
           data:data.field,
           success:function(data){
               /*验证码通过*/
               if(data.code!=-1){
                   /*查找到用户信息*/
                   if(data.code>0){
                       layer.msg(data.msg,function () {
                           window.location.href = "/index.jsp";
                       })
                   }else{//未查找到信息
                       layer.msg(data.msg);
                       $("#codehz").click();//刷新验证码
                       /*将按钮恢复为可登录状态*/
                       _this.text("登录").attr("disabled",false).removeClass("layui-disabled");
                   }
               }else{//验证码输入错误则重新生成
                   layer.msg(data.msg);
                   _this.text("登录").attr("disabled",false).removeClass("layui-disabled");
                   $("#codehz").click();//刷新验证码
               }
           }
       })
        return false;
    })

???值得一提的是,需要在用户登录失败后将登录按钮重置为可登录状态,同时需要在登录失败后再次发起getcode请求获取新的验证码(方法:在图片src属性增加’?'以保证请求更新,其实就是带假参数,这里采用点击事件是则利用了前台jsp里设置的点击时间更新请求的写法)

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-21 15:16:46  更:2021-08-21 15:17:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 9:13:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码