精华内容
下载资源
问答
  • springboot登录验证
    千次阅读
    2020-08-14 00:02:37

    Spring的学习笔记还写差AOP(面向切面编程)的内容,因为最近忙着学习写后台接口的内容,就先搁置一下。既然学习和操作了,那不记录起来也就少了一份收获。此次用的是SpringBoot来做后台接口的开发。接下来记录登录接口和页面的代码实现。

    一、前端页面的编写

    这里实现了一个最简单的页面,表单包括的两个输入框、一个登录按钮用于输入用户名和密码。
    (代码和实现效果图)效果
    然后是前端js的代码实现,思路是获取到两个输入框的值(这里只做了简单的判断,输入值是否为空,可根据需要增加认证条件),然后调用后台接口把值传过去,后台做认证操作。

    $("#login").click(function () {
            // alert("hello");
            var username =document.getElementById('username').value;
            // alert(username.id)
            if(null == username || "" === username) {
                alert("请输入用户名");
                return;
            }
            var password =document.getElementById('password').value;
            if(null == password || "" === password) {
                alert("请输入密码");
                return;
            }
            //调用登录接口
            $.ajax({
                url : "http://localhost:8080/userLoginTest",
                type : "POST",
                data : {
                    "username":username,
                    "password":password
                },
                dataType : "json",//后台返回来的数据类型
                //contentType: "application/json;charset=UTF-8",
                success : function(data) {
                    //后台返回数据
                    if (data.status === 'ok') {
                        alert(data.message);
                        window.location.href = "/index";
                    }
                    else {
                        alert("用户名或密码错误,请仔细检查~~");    //登录失败
                    }
                },
                error:function (data) {
                    alert("用户名或密码错误!" + data.message)
                }
            });
        });
    

    二、后台接口的实现

    这里就贴一下简单验证的接口实现代码吧,Mapper和Sevice的方法就不贴上来了, 就是简单的在数据库中查询有没有相应用户。

    @PostMapping("/userLoginTest")
        @ResponseBody
        public String userLoginTest(HttpServletRequest request, HttpSession session, @RequestParam Map<String, String> parameter) {
            // 获取前端传来的username字段,必须与输入框的id值相同
            String username = request.getParameter("username");
            // 获取前端传来的password字段,必须与输入框的id值相同
            String password = request.getParameter("password");
    
            // 这里可以做个控制台输出获取的字段值
            System.out.println("用户名:" + username + " " + "密码:" + password);
            UserInfo userInfo;
            try {
                // 执行自定义的Mapper类中的查询方法
                userInfo = userService.getUser(username, password);
    
                // 后台做简单判断,是否获取相应用户
                if (userInfo != null) {
                    // 把当前用户信息存到session里,用于后续操作
                    session.setAttribute("userInfo", userInfo);
                    // 返回给前端的数据设置(登录成功)
                    parameter.put("message", "登录成功");
                    parameter.put("status", "ok");
                }
            } catch (Exception e) {
                // 返回给前端的数据设置(登录失败)
                parameter.put("message", "登录失败,用户不存在");
                parameter.put("status", "no");
            }
            return JSON.toJSONString(parameter);
        }
    

    三、成功效果


    以上就是简单的springboot写的登录操作接口实现和前端代码实现,这里的认证有点太简单,而且需要自己写认证的操作,下一篇会记录SpringBoot整合Shiro来实现登录认证和页面拦截功能(即没登录成功就不能进入index首页等)。

    更多相关内容
  • java SpringBoot登录验证token拦截器

    千次阅读 2022-07-05 09:50:55
    springBoot拦截器定义,以及token获取,单点登录设定,全局异常定义。

    用户访问接口验证,如果用户没有登录,则不让他访问除登录外的任何接口。

    实现思路:

    1.前端登录,后端创建token(通过JWT这个依赖),返给前端

    2.前端访问其他接口,传递token,后端判断token存在以或失效

    3.失效或不存在,则返回失效提示,前端根据接口返回的失效提示,让其跳转到登录界面


    目录

    实现思路:

    注解定义

    调用都通过注解

    登录才能通过

    注解的作用说明@Target代表此注解,能@到哪些代码上

    token生成与验证

    拦截器定义

    拦截器配置定义

    拦截器的方法执行类

    注解使用

    返回值-全局异常类定义

    各种测试

    不传token

    制造可行的假token

    伪造token测试

    程序员使用:方法不加注解,测试

    程序员使用:加上,调用通过,注解

    拓展:从请求中获取token


    注解定义

    定义2个注解,1个用于任何接口都能访问,另外一个用于需要登录才能访问

    调用都通过注解

    package com.example.etf.story.tools;
    
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @Target({ElementType.METHOD, ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface PassToken {
        boolean required() default true;
    }

    登录才能通过

    package com.example.etf.story.tools;
    
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @Target({ElementType.METHOD, ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface UserLoginToken {
        boolean required() default true;
    }

    注解的作用说明
    @Target代表此注解,能@到哪些代码上

    @Target:注解的作用目标

    @Target(ElementType.TYPE)——接口、类、枚举、注解
    @Target(ElementType.FIELD)——字段、枚举的常量
    @Target(ElementType.METHOD)——方法
    @Target(ElementType.PARAMETER)——方法参数
    @Target(ElementType.CONSTRUCTOR) ——构造函数
    @Target(ElementType.LOCAL_VARIABLE)——局部变量
    @Target(ElementType.ANNOTATION_TYPE)——注解
    @Target(ElementType.PACKAGE)——包

    @Retention:注解的保留位置

    RetentionPolicy.SOURCE:这种类型的Annotations只在源代码级别保留,编译时就会被忽略,在class字节码文件中不包含。
    RetentionPolicy.CLASS:这种类型的Annotations编译时被保留,默认的保留策略,在class文件中存在,但JVM将会忽略,运行时无法获得。
    RetentionPolicy.RUNTIME:这种类型的Annotations将被JVM保留,所以他们能在运行时被JVM或其他使用反射机制的代码所读取和使用。

    @Document:说明该注解将被包含在javadoc
    @Inherited:说明子类可以继承父类中的该注解

    token生成与验证

    传送门

    然后springBoot拦截器验证token

    拦截器定义

    拦截器配置定义

    拦截器拦截,除了登录和发送短信,不拦截,其他都拦截

    package com.example.etf.story.tools;
    
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    
    import javax.annotation.Resource;
    
    @Configuration
    public class MyMvcConfig implements WebMvcConfigurer {
        @Resource
        private LoginInterceptor loginInterceptor;
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            //注册自己的拦截器,并设置拦截的请求路径
            //addPathPatterns为拦截此请求路径的请求
            //excludePathPatterns为不拦截此路径的请求
            registry.addInterceptor(loginInterceptor).addPathPatterns("/story/*").excludePathPatterns("/story/sendSMS")
                    .excludePathPatterns("/story/signOrRegister");
        }
    }
    

    拦截的时候,调用的方法,给谁通过

    其中service查询数据库,有没有用户,的方法要自己写

    拦截器的方法执行类

    package com.example.etf.story.tools;
    
    import com.auth0.jwt.JWT;
    import com.auth0.jwt.exceptions.JWTDecodeException;
    
    import com.example.etf.story.dao.R;
    import com.example.etf.story.paramer.UserInfoParam;
    import com.example.etf.story.service.TestClientService;
    import com.example.etf.story.service.TokenUtils;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.stereotype.Component;
    import org.springframework.web.method.HandlerMethod;
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    
    import javax.annotation.Resource;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.lang.reflect.Method;
    
    @Slf4j
    @Component
    public class LoginInterceptor extends R implements HandlerInterceptor {
        /**
         * 目标方法执行前
         * 该方法在控制器处理请求方法前执行,其返回值表示是否中断后续操作
         * 返回 true 表示继续向下执行,返回 false 表示中断后续操作
         *
         * @return
         */
        @Resource
        private TestClientService testClientService;
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            String token = request.getHeader("token");// 从 http 请求头中取出 token
            // 如果不是映射到方法直接通过
            if (!(handler instanceof HandlerMethod)) {
                return true;
            }
            HandlerMethod handlerMethod = (HandlerMethod) handler;
            Method method = handlerMethod.getMethod();
    
            //检查方法是否有passtoken注解,有则跳过认证,直接通过
            if (method.isAnnotationPresent(PassToken.class)) {
                PassToken passToken = method.getAnnotation(PassToken.class);
                if (passToken.required()) {
                    return true;
                }
            }
            //检查有没有需要用户权限的注解
            if (method.isAnnotationPresent(UserLoginToken.class)) {
                UserLoginToken userLoginToken = method.getAnnotation(UserLoginToken.class);
                if (userLoginToken.required()) {
                    // 执行认证
                    if (token == null) {
                        throw new RuntimeException("无token,请重新登录");
                    }
                    // 获取 token 中的 user id
                    String phone;
                    try {
                        phone = JWT.decode(token).getClaim("phone").asString();
                    } catch (JWTDecodeException j) {
                        throw new RuntimeException("token不正确,请不要通过非法手段创建token");
                    }
                    //查询数据库,看看是否存在此用户,方法要自己写
                    UserInfoParam userInfoParam = testClientService.selectUserByPhone(phone);
                    if (userInfoParam == null) {
                        throw new RuntimeException("用户不存在,请重新登录");
                    }
    
                    // 验证 token
                    if (TokenUtils.verify(token)) {
                        return true;
                    } else {
                        throw new RuntimeException("token过期或不正确,请重新登录");
                    }
    
                }
            }
              throw new RuntimeException("没有权限注解一律不通过");
        }
    
    
    
    
            /**
             * 目标方法执行后
             * 该方法在控制器处理请求方法调用之后、解析视图之前执行
             * 可以通过此方法对请求域中的模型和视图做进一步修改
             */
            @Override
            public void postHandle (HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView
            modelAndView) throws Exception {
                System.out.println("postHandle执行{}");
    
            }
            /**
             * 页面渲染后
             * 该方法在视图渲染结束后执行
             * 可以通过此方法实现资源清理、记录日志信息等工作
             */
            @Override
            public void afterCompletion (HttpServletRequest request, HttpServletResponse response, Object handler, Exception
            ex) throws Exception {
                System.out.println("afterCompletion执行异常");
    
            }
    
    }
    

    注解使用

    在controller层加入注解进行测试

    返回值-全局异常类定义

    加入全局,异常类,这样当异常,会返回你所指定的异常

    package com.example.etf.story.tools;
    
    import com.alibaba.fastjson.JSONObject;
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    
    @ControllerAdvice
    public class GloablExceptionHandler {
        @ResponseBody
        @ExceptionHandler(Exception.class)
        public Object handleException(Exception e) {
            String msg = e.getMessage();
            if (msg == null || msg.equals("")) {
                msg = "服务器出错";
            }
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("message", msg);
            jsonObject.put("status",500)
            return jsonObject;
        }
    }
    

    各种测试

    不传token

    成功

    制造可行的假token

     我们测试一下加token后的

     因为数据库里,我没有插入,所以不存在,我们在随便写个token

    伪造token测试

    我们在试试

    程序员使用:方法不加注解,测试

    程序员使用:加上,调用通过,注解

     我们试试,加上通过注解

    拓展:从请求中获取token

    我们在试试从中获取token

     结束。

    参考文章:

    SpringBoot集成JWT实现token验证 - 简书

    springboot对请求的接口实现token拦截以及参数校验_kotomeli的博客-CSDN博客_springboot拦截请求参数

    展开全文
  • Springboot简单用户登录验证

    千次阅读 2021-11-13 23:03:50
    //验证登录能否成功 public class UserService { public String loginService(String username,String password){ UserDao userDao = new UserDao(); //验证用户是否存在 User user = userDao.loginDao(username); ...

    目录

    初版(代码糅在一块)

    mvc三层架构

    bean层

    数据访问层(持久层dao),负责数据库中的信息操作管理

    业务逻辑层service

    表现层controller

    初版(代码糅在一块)

    结合了spring后,以及前面l连接数据库的内容,做出初版的页面匹配代码

    先创建一个User类,如果输入的用户名存在,就从数据库中将这个用户的信息读取出来存储到我们创建的user类中,然后与输入的密码进行匹配

    通过lombok插件,可以省略类里面的很多的创建步骤

    import lombok.*;
    //set,get方法,构造方法有参无参,toString方法
    @Setter
    @Getter
    @AllArgsConstructor
    @NoArgsConstructor
    @ToString
    public class User {
        private String userid;
        private String username;
        private String password;
    
    }
    
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    //返回值是String类型的内容
    @RestController
    public class UserController3 {
        //登录的接口
        @RequestMapping("/userlogin")
        public String userlogin(String username,String password){
           try {
                //连接数据库的驱动
               Class.forName("com.mysql.jdbc.Driver");
               Connection conn = DriverManager.getConnection("jdbc:mysql://master:3306/test", "root", "123456");
               PreparedStatement ps = conn.prepareStatement("select * from login where username=?");
               ps.setString(1,username);
               ResultSet rs = ps.executeQuery();
               //查询的用户下面没有内容,返回用户不存在
               if(!rs.next()){
                   return "该用户不存在";
               }
               //刚才的rs中已经读取到了关于用户的所有信息,我们将他通过数据库中的字段名称获取后,通过User类的构造方法储存
               User user = new User(
                       rs.getString("userid"),
                       rs.getString("username"),
                       rs.getString("password"));
               //如果数据库中存储对应的密码与你输入的密码不匹配,返回密码错误,把不为空的值放在前可以有效避免空指针异常,
               if(!(user.getPassword()).equals(password)){
                   return "你的密码错误";
               }
                conn.close();
                ps.close();
                rs.close();
           }catch (Exception e){
                e.printStackTrace();
           }
            return "登录成功";
        }
    }

    我们来进行测试:

    输入正确的用户名以及密码

     输入正确的用户名和错误的密码

    不存在的用户

    mvc三层架构

    上面写的代码实现了3部分功能,页面访问输用户需求内容用作交互,验证用户名用户密码是否正确,以及查寻数据库中的内容,这三部分的代码都堆在一起,日后如果有需要修改的地方是非常让人头疼的,于是我们引入了架构

    最常见的mvc架构:

    UI(表现层controller): 主要是指与用户交互的界面。用于接收用户输入的数据和显示处理后用户需要的数据。

    BLL:(业务逻辑层service): UI层和DAL层之间的桥梁。实现业务逻辑。业务逻辑具体包含:验证、计算、业务规则等等。

    DAL:(数据访问层dao): 与数据库打交道。主要实现对数据的增、删、改、查。将存储在数据库中的数据提交给业务层,同时将业务层处理的数据保存到数据库。(当然这些操作都是基于UI层的。用户的需求反映给界面(UI),UI反映给BLL,BLL反映给DAL,DAL进行数据的操作,操作后再一一返回,直到将用户所需数据反馈给用户)

    先给出目录图:

    请忽略掉test,只是用来测试功能的

     连接数据库以及创建构造器的工具类:JDBCUtil 之前有写过

    (18条消息) jdbc 模拟增删查_zzds111的博客-CSDN博客

    bean层

    用来存储在数据库中查询到的用户信息,

    我们在bean文件目录下创建User类, 在dao层查询到的数据会利用这个User类存储,方便在各层之间使用

    import lombok.*;
    
    //set,get方法,构造方法有参无参,toString方法
        @Setter
        @Getter
        @AllArgsConstructor
        @NoArgsConstructor
        @ToString
    public class User
    {
        private String userid;
        private String username;
        private String password;
    
    }
    

    数据访问层(持久层dao),负责数据库中的信息操作管理

    我们这里就是通过传入的用户名,获取该用户在数据库里的所有信息

    然后通过结果集中的getString方法获取用户信息,将信息通过User类的set方法传入user对象中,将user对象返回到service层判断。

    import comshujia.spring.mvc.Until.JDBCUtil;
    import comshujia.spring.mvc.bean.User;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    public class UserDao {
        public User loginDao(String username){
            //查询数据库,将查询到的信息存储 ->User(id,username,password)
            //这里先将user定义为null,如果后面查询不到用户信息就返回空的user
            User user = null;
            try {
                Connection conn = JDBCUtil.getConn();
                PreparedStatement ps = JDBCUtil.getPs("select * from login1 where username=?");
                ps.setString(1,username);
                ResultSet rs = ps.executeQuery();
                if(rs.next()){
                //这里我们需要新创建一个user,因为上面的为空会报空指针异常
                    user = new User();
                    user.setUserid(rs.getString("userid"));
                    user.setUsername(rs.getString("username"));
                    user.setPassword(rs.getString("password"));
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
    //        finally {
    //            JDBCUtil.closeAll();
    //        }
            return user;
    
        }
    }
    

    业务逻辑层service

    我们在这一层的任务就是判断dao层返回的信息是否符合设置的逻辑规则,再将判断后的结果返回给表现层controll

    所以先传需要传入用户名和密码两个参数

    创建UserDao的对象,传入用户名,获取到存储该用户信息的user对象

    如果这个对象是空的显示用户名不存在,查询到了内容再看看密码是否匹配

    import comshujia.spring.mvc.bean.User;
    import comshujia.spring.mvc.dao.UserDao;
    
    //验证登录能否成功
    public class UserService {
        public String loginService(String username,String password){
            UserDao userDao = new UserDao();
            //验证用户是否存在
            User user = userDao.loginDao(username);
            if(user==null){
                return "用户不存在";
            }
            if(!user.getPassword().equals(password)){
                return "密码错误";
            }
            // 验证用户码是否正确
            return "登录成功";
        }
    
    }
    

    表现层controller

    负责与前端的交互,用户可以输入用户名,密码等信息,并且返回一个操作结果进行展示

    import comshujia.spring.mvc.service.UserService;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class UserConntroller {
        @RequestMapping("/userlogin")
        public String userlogin(String username,String password){
            //登录成功还是失败需要业务逻辑层的验证
            UserService userService = new UserService();
            String message = userService.loginService(username,password);
            return message;
        }
    }
    

    演示:

    这是我创建的数据表

    运行application

     输入正确的用户名和密码

     输入正确的用户名和错误的密码

    输入错误的用户名

     避雷:我在上面的dao层连接数据库后,写了一个关闭连接

     之后遇到的问题是,网页访问第一次正常,第二次开始就异常

     这是因为我写的JDBC工具类,为了方便将连接驱动写在了静态代码块中,这样的后果就是只会连接一次驱动,我关闭了连接后,多次调用工具类是没有用的,static中的内容只会执行一次

    为了观感直接写一个打印一个获取连接的字符串

     我们再登录页面多刷新几次

    控制台始终只会打印一次 

    展开全文
  • Springboot实现短信登录验证

    千次阅读 2021-08-16 20:55:07
    学习笔记——实现短信登录验证功能--Servlet/SSM/SpringBoot都可以用 小白记录一下短信验证登入的实现,方便以后可以拿来直接用。 发短信平台:互亿无线 官网地址 登入注册啥的就不说了,新人注册会送十条短信验证,...

    Springboot学习笔记——Java实现短信登录验证功能--Servlet/SSM/SpringBoot都可以用

    小白记录一下短信验证登入的实现,方便以后可以拿来直接用。
    发短信平台:互亿无线 官网地址

    在这里插入图片描述

    登入注册啥的就不说了,新人注册会送十条短信验证,想要buy一些学习用的话 也很便宜,就不多说了
    在这里插入图片描述
    在这里插入图片描述
    我们主要需要的就是这个APIID和APPKEY,到时候工具类需要用。

    pom工程需要导入两个依赖:

         <!--发送手机验证码-->
            <dependency>
                <groupId>dom4j</groupId>
                <artifactId>dom4j</artifactId>
                <version>1.6.1</version>
            </dependency>
            <dependency>
                <groupId>commons-httpclient</groupId>
                <artifactId>commons-httpclient</artifactId>
                <version>3.1</version>
            </dependency>
    

    接下来贴上工具类代码:

    import org.apache.commons.httpclient.HttpClient;
    import org.apache.commons.httpclient.HttpException;
    import org.apache.commons.httpclient.NameValuePair;
    import org.apache.commons.httpclient.methods.PostMethod;
    import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.DocumentHelper;
    import org.dom4j.Element;
    
    import java.io.IOException;
    
    public class SendSMS {
        private static String Url = "http://106.ihuyi.cn/webservice/sms.php?method=Submit";
    
        public static int sendYzCode(String phone) {
    
            HttpClient client = new HttpClient();
            PostMethod method = new PostMethod(Url);
    
            client.getParams().setContentCharset("GBK");
            method.setRequestHeader("ContentType","application/x-www-form-urlencoded;charset=GBK");
    
            int mobile_code = (int)((Math.random()*9+1)*100000);
    
            String content = new String("您的验证码是:" + mobile_code + "。请不要把验证码泄露给其他人。");
    
            NameValuePair[] data = {//提交短信
                    new NameValuePair("account", "填你的APIID"), //查看用户名是登录用户中心->验证码短信->产品总览->APIID
                    new NameValuePair("password", "填你的APPKEY"),  //查看密码请登录用户中心->验证码短信->产品总览->APIKEY
                    //new NameValuePair("password", util.StringUtil.MD5Encode("密码")),
                    new NameValuePair("mobile", phone),
                    new NameValuePair("content", content),
            };
            method.setRequestBody(data);
    
            try {
                client.executeMethod(method);
    
                String SubmitResult =method.getResponseBodyAsString();
    
                //System.out.println(SubmitResult);
    
                Document doc = DocumentHelper.parseText(SubmitResult);
                Element root = doc.getRootElement();
    
                String code = root.elementText("code");
                String msg = root.elementText("msg");
                String smsid = root.elementText("smsid");
    
                System.out.println(code);
                System.out.println(msg);
                System.out.println(smsid);
    
                if("2".equals(code)){
                    System.out.println("短信提交成功");
                    return mobile_code;
                }
    
            } catch (HttpException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (DocumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return 0;
        }
    }
    
    

    工具类只需要把APIID和APPKEY替换一下就可以用啦。

    接下来贴前端代码

          <div class="login-style">
                            <dl>
                                <dd><input name="phone" type="text" id="phone" placeholder="您的手机号码"/></dd>
                            </dl>
                            <!--<dl id="yz-code" style="display: none;">
                           <dd><input type="text" id="txtCode2" name="txtCode2" style="width: 133px; margin-right: 10px;" placeholder="验证码" /><img id="Img1" src="" width="90" height="34" title="点击换一个" style="vertical-align: middle; margin-top: -4px;" onclick="this.src='/ImgCode.aspx?t='+Math.random()*100" /></dd>
                           </dl> -->
                            <dl>
                                <dd><input type="text" id="code" name="code" onkeydown="enterHandler(event)" style="width: 133px;"
                                           placeholder="短信验证码"/><input type="button" id="zphone" class="btn_mfyzm"
                                             value="获取手机验证码" /></dd>
                            </dl>
                            <div class="remember">
                                <input type="checkbox" id="issave1" checked/><label for="issave1">下次自动登录</label>
                            </div>
                            <div class="tishi"></div>
                            <button type="button" id="dynamicLogon" style="outline:none">登 录</button>
                        </div>
    
    
    

    JS代码:

    
    <script type="text/javascript">
        $(function () {
            $("#zphone").click(function () {
                //先判断是否输入手机号码,再判断手机号格式是否正确,最后判断是否是已经注册过的手机号
                var phone=$("#phone").val();
                if(phone==null||phone==""){
                    // $("#msg").text("手机号不能为空").css("color","red");
                    Tip('手机号不能为空!');
                    $("#phone").focus();
                }else if(!(/^1[3456789]\d{9}$/.test(phone))){
                    // $("#msg").text("手机号格式不正确").css("color","red");
                    Tip('手机号格式不正确!');
                    $("#phone").focus();
                }else{
                    $.ajax({
                        url:'user/checkPhone',
                        type:'post',
                        data:{"phone":phone},
                        dataType:'json',
                        success:function (data) {
                            if(data){
                                //发送验证码
                                alert("通过啦!准备执行发送验证码方法");
                                sendCode(phone);
                            }else{
                                Tip('手机号尚未注册,请注册后再登陆!')
                                // $("#msg").html("<a href='login.html'>手机号尚未注册,请注册后再登陆</a>");
                            }
                        }
                    });
                }
            })
    
            //登陆
            $("#dynamicLogon").click(function () {
                var phone=$("#phone").val();
                var code=$("#code").val();
                $.ajax({
                    url:'toPhoneLogin',
                    type:'post',
                    data:{"code":code,"phone":phone},
                    dataType:'json',
                    success:function (data) {
                        if(data){
                            //登陆成功,网站首页
                            window.location.href="home";
                        }else{
                            //失败
                            Tip('登陆失败,请重试')
                            // $("#msg").text("登陆失败,请重试").css("color","red");
                        }
                    }
    
                })
            });
    
        })
    
        function sendCode(phone) {
            $.ajax({
                url:'sendCode',
                type:'post',
                data:{"phone":phone},
                dataType:'json',
                success:function (data) {
                    if(data){
                        // $("#msg").text("验证码发送成功").css("color","green");
                        Tip('验证码发送成功!');
                    }else{
                        // $("#msg").text("验证码发送失败,请重试").css("color","red");
                        Tip('验证码发送失败,请重试!');
                    }
                }
    
            })
        }
    </script>
    

    后台代码:

     /**
         * 发送手机验证码
         */
        @RequestMapping("/sendCode")
        public void sendCode(HttpServletRequest request, HttpServletResponse response) throws IOException {
            String phone = request.getParameter("phone");
            int code = SendSMS.sendYzCode(phone);
    
            if (code != 0) {
                session = request.getSession();
                session.setAttribute("yzcode", phone + "#" + code);//1227346764#8765
                response.getWriter().print(true);
            } else {
                response.getWriter().print(false);  //没短信了
            }
    
    
        }
    
        @RequestMapping("/toPhoneLogin")
        public void toPhoneLogin(HttpServletRequest request, HttpServletResponse response) throws IOException {
            String code = request.getParameter("code");
            String phone = request.getParameter("phone");
            String code1 = phone + "#" + code;//页面提交的
            String code2 = (String) session.getAttribute("yzcode");//session中获取到的
            if (code1.equals(code2)) {
                //登陆成功,将登陆的用户保存到session中
                //根据用户的电话获取登陆用户
                User loginUser = userService.getUserByPhone(phone);
    //            request.getSession()
                session.setAttribute("user", loginUser);
                response.getWriter().print(true);
            } else {
                response.getWriter().print(false);
            }
    
        }
    
    

    最后贴上效果图
    在这里插入图片描述

    在这里插入图片描述
    至此短信登录功能就搞定了

    展开全文
  • SpringBoot实现基于token的登录验证

    千次阅读 2021-06-11 14:02:04
    客户端通过用户名和密码调用登录接口,当验证数据库中存在该用户后,将用户的信息按照token的生成规则,生成一个字符串token,返回给客户端,客户端在调用其他接口的时候,需要在请求头上带上token,来验证登录信息。...
  • 第一步 打开服务器redis 第二步 redis管理工具连接 第三步 在springboot中加入jedis和commonpool2的依赖 第四步 创建jedis工具类 第五步 在业务层引用redis
  • springboot整合Oauth2,GateWay实现网关登录授权验证
  • springboot关闭http登录验证

    千次阅读 2019-05-05 12:43:06
    springboot 2.0 因为引入了下面的security配置,会导致每次在访问的时候都需要输入用户名和密码 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-...
  • 1.架构: spring boot + jpa + thyemleaf, mysql数据库 2.功能实现: 1)使用Logback进行日志记录; 2)使用HandlerInterceptor接口实现登陆认证 3)登陆验证码的生成
  • 目录   前言: 概念: 源码: 步骤: (1) 首先我准备一个数据库 shiro_demo 并且新建了一张bos_user 的表 (2)在pom 文件中引入 Shiro 1.5.2 的jar 包 (3) 配置文件中配置数据连接信息 (4)编写Shiro 的配置...
  • 1、导入依赖 <dependency> <groupId>... } } token过期: 参考博客:springboot+jwt
  • } /** * 登录 */ @RequestMapping(value = "/login", method = RequestMethod.POST) public String login(Model model, HttpServletRequest request, String userName, String password) { //验证登录信息 if ...
  • 总结 前后端分离 springboot+shiro登录验证的几种方式登录验证硬编码方式(不推荐)在自定义过滤器中返回给前端错误码设置shiro的loginURL使用注解方式(推荐)权限控制使用注解方式 登录验证 在前后端的登录验证中...
  • 检查请求参数的基本格式 如何使用此框架 导入依赖 <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-validationartifactId> dependency> 在实体类的属性上添加验证注解 ...
  • 后台提供login接口 需要参数:username password 返回结果:msg status (token) 1.service层 2.controller 前端带参访问接口获得数据
  • SpringBoot中自定义注解进行登录校验 1.自定义接口-LoginCheck @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE }) @Retention(RetentionPolicy.RUNTIME) @Documented public @...
  • SpringBoot 登录 session

    2022-08-24 17:11:07
    下面演示的是SpringBoot、Session 实现登录、注销功能。
  • SpringBoot整合Shiro、JWT和Redis实现token登录授权验证以及token刷新 前端代码为一个博客页面,使用了Semantic UI框架结合thymeleaf模板 SpringBoot结合JWT+Shiro+Redis实现token无状态登录授权 [TOC] 一、引言 ​ ...
  • SpringBoot注解验证参数

    2020-10-21 09:45:44
    注解 作用类型 解释 @NotNull 任何类型 属性不能为null @NotEmpty 集合 集合不能为null,且size大于0 @NotBlanck 字符串、字符 字符类不能为null,且去掉空格之后长度大于0 ...
  • SpringBoot+Vue实现验证码登录

    千次阅读 2021-08-11 09:57:49
    最近做项目时使用到了通过验证码图片code参数实现登录验证的技术,这里记录一下,以供参考 文章目录效果图后端接口编写验证码工具类Controller定义请求登录验证前端配置图片请求及点击刷新请求登录验证 效果图 ...
  • springboot 签名验证

    千次阅读 2021-08-25 10:32:30
    } //***************************签名和验证******************************* public static byte[] sign(byte[] data, String privateKeyStr) throws Exception { PrivateKey priK = getPrivateKey(privateKeyStr)...
  • springboot整合mybatis实现登录注册功能,springboot整合mybatis实现登录注册功能。
  • springboot实现邮箱验证

    千次阅读 多人点赞 2021-11-19 10:24:10
    这里用springboot来测试一下邮件发送验证码 首先需要开启邮箱第三方支持以及获取授权码 以QQ邮箱为例: QQ邮箱设置——账户——开启POP3/SMTP服务——完成验证后获得授权码 导入依赖: <dependency> <...
  • JWT,简单实现调用后台接口需要/不需要token验证
  • 验证用户是否登陆有效的几种方法 最近在阅读几个开源项目的代码,总结一下各种风格的登陆校验 方案一.使用拦截器校验session中是否包含loginUser或Token等信息 结合代码说明: @Component public class ...
  • 目录大纲Spring Boot中实现登录校验简单实现1. 接口的统一登录检验2. Session属性写入时机3 校验登录信息有效后写入ThreadLocal避免每个接口重复取请求头信息 Spring Boot中实现登录校验简单实现 在实际系统中开发...
  • 主要介绍了SpringBoot整合Hibernate Validator实现参数验证功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 主要介绍了SpringBoot使用AOP+注解实现简单的权限验证的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 82,387
精华内容 32,954
关键字:

springboot登录验证

spring 订阅