实现登录验证有哪些方式?
方式一:基于WebFilter过滤器和Session存取登录信息
流程:1、登录成功后,把用户信息存入Session;2、下次同一个会话获取Session里面的值,如果为空,表明为未登录,不能访问主页面,否则可以;3、通过过滤器来实现登录页面的跳转;4、配置拦截请求URL可以通过注解和XML配置。

方式二:登录、注册、短信验证
过程:1、发送一个电话号码到后端;2、后端随机生成一个验证码放入Redis中;3、调用短信接口(用的阿里云的,可免费用三个月)发送到用户手机;4、逻辑参考发送短信工具类SendSMSUtil;5、发送手机验证码和校验验证码参考控制层SmsCtroller。
//阿里云短息验证码依赖
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.4.0</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>1.0.0</version>
</dependency>
方式三:登录、注册、邮箱验证
过程:1、相比于短信验证不要钱;2、在QQ邮箱设置配置(设置->账户->开启服务->点击生成授权码->yml里面写上授权码);3、源码实现单人、多人邮件发送,以及邮件带附件

<!--邮箱依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
方式四:登录、注册、图片验证
作用:同短信、邮件验证雷同,防止大量的表单提交,为后台服务器以及数据库减轻负担 ;换种说法就是:有验证的地方就一定有表单的提交,为了防止不友好的提交,比如疯狂提交,遭遇黑客,我们知道提交表单就需要写数据到数据库,此时数据库就会短时间内执行大量写入,当数据库执行不过来就会造成数据库崩溃。
过程:1、生成图片验证码(采用Java自带的AWT技术,即抽象窗体工具集_Abstract Windows Tookit,它是最早的Sun提供的GUI库图形用户界面;实现:弄一张图片,上面加上我们生成的验证码)
//通过Java代码生成图片验证码
public class ImageCode {
//数组——提供验证码数据
static String[] strings = {"a","b","c","d","e","f","g","h","i","j","k","l",
"m","n","o","p","q","r","s","t","u","v","w","x","y","z",
"1","2","3","4","5","6","7","8","9"};
public static void main(String[] args) throws Exception {
//需求:通过Java代码生成图片(图片上含有数字、字母、干扰线)
//
/**
* 我们把生成图片验证码比如成画画,可分为下面几个步骤
* 1、画板
* 2、笔
* 3、数据(strings数组随机取出4个数)
* 4、通过 笔 把 数据 画到 画板
* 5、生成 图片验证码
*/
//1、画板(JDK提供了一个画板类:BufferedImage)
/**
* width, 图片宽度
* height, 图片高度
* imageType 图片类型
*/
BufferedImage image = new BufferedImage(150, 50, BufferedImage.TYPE_INT_RGB);
//2、笔(画笔对象:Graphics)
Graphics g = image.getGraphics();
/**设置画笔颜色*/
g.setColor(Color.cyan);
/**
* 画填充矩形,来更改图片颜色
* x, 相对于画板位置
* y,
* width, 填充高度
* height 填充宽度
*/
g.fillRect(0, 0, 150, 50);
//3、数据(随机娶四个从数组strings)_
//补充:设置数据显示颜色采用RGB:g.setColor(new Color(r, g, b));
//设置数据显示角度:需要旋转,网上查
g.setColor(Color.RED);
g.setFont(new Font("宋体",Font.BOLD, 35));
for (int i = 0; i < 4; i++) {
/**new Random().nextInt(strings.length)_用于生成指定数字里面的随机数*/
String s = strings[new Random().nextInt(strings.length)];
/**
* 4\每获取一个数据写在画板上
* iterator, 数据
* x,
* y 画板上相对位置
*/
g.drawString(s, 20+i*30, 35);
}
//画干扰线
/**
* x1, y1, x2, y2 两个坐标,两个点。确定一条线
*/
g.setColor(Color.black);
for (int i = 0; i < 3; i++) {
g.drawLine(10, 10+i*10, 140, 15+i*10);
}
//5、生成 图片验证码(把image生成本地磁盘上:ImageIO)
/**
* im, 画板
* formatName, 图片后缀名
* output 指定本地的输出路径
*/
ImageIO.write(image, "jpg", new File("G:\\server\\picture\\aaa.jpg"));
}
}
