javaee之黑马旅游网2

news2024/9/20 5:38:21

下面我们来做邮件激活功能

提示邮箱需要登录才能进行账号激活

保证用户填写的邮箱是正确的,可以推广宣传信息到邮箱中

下面分成两部分来做:

第一部分:发送邮件

这个功能就是通过工具类来进行实现的,直接从网上copy的代码

MailUtils.java

package util;

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;

/**
 * 发邮件工具类
 */
public final class MailUtils {
    private static final String USER = ""; // 发件人称号,同邮箱地址
    private static final String PASSWORD = ""; // 如果是qq邮箱可以使户端授权码,或者登录密码

    /**
     *
     * @param to 收件人邮箱
     * @param text 邮件正文
     * @param title 标题
     */
    /* 发送验证信息的邮件 */
    public static boolean sendMail(String to, String text, String title){
        try {
            final Properties props = new Properties();
            props.put("mail.smtp.auth", "true");
            props.put("mail.smtp.host", "smtp.qq.com");

            // 发件人的账号
            props.put("mail.user", USER);
            //发件人的密码
            props.put("mail.password", PASSWORD);

            // 构建授权信息,用于进行SMTP进行身份验证
            Authenticator authenticator = new Authenticator() {
                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
                    // 用户名、密码
                    String userName = props.getProperty("mail.user");
                    String password = props.getProperty("mail.password");
                    return new PasswordAuthentication(userName, password);
                }
            };
            // 使用环境属性和授权信息,创建邮件会话
            Session mailSession = Session.getInstance(props, authenticator);
            // 创建邮件消息
            MimeMessage message = new MimeMessage(mailSession);
            // 设置发件人
            String username = props.getProperty("mail.user");
            InternetAddress form = new InternetAddress(username);
            message.setFrom(form);

            // 设置收件人
            InternetAddress toAddress = new InternetAddress(to);
            message.setRecipient(Message.RecipientType.TO, toAddress);

            // 设置邮件标题
            message.setSubject(title);

            // 设置邮件的内容体
            message.setContent(text, "text/html;charset=UTF-8");
            // 发送邮件
            Transport.send(message);
            return true;
        }catch (Exception e){
            e.printStackTrace();
        }
        return false;
    }

    public static void main(String[] args) throws Exception { // 做测试用
        MailUtils.sendMail("itcast_xian@163.com","你好,这是一封测试邮件,无需回复。","测试邮件");
        System.out.println("发送成功");
    }



}

 测试一下自动发送邮件

需要修改文件中几个地方

注意你的发送邮箱一定要把第三方客户端登录打开 

第二部分:用户点击邮件激活

第一步:先来说发送邮件到邮箱里面

在什么位置发送邮件?肯定是在你注册保存用户信息之后发送邮件。

在UserServiceImpl里面

在我们设置邮件信息的时候,它本身就是在MailUtils里面设置好的text文本是html类型,所以,我们可以直接在里面弄上html标签

但是我们在写这个邮件内容的时候,注意到一个问题,假如就直接如下这样写

那么多用户,服务器怎么会知道过来的是哪一个用户?

所以我们就要用到User对象里面的code激活码字段信息,也就是每次发送邮件的时候,给用户发送一个独有的激活码

那么现在又会有一个问题,唯一激活码从哪里来?那么这里也做好了,如下

 

 所以这个链接应该进行如下的拼接

既然传递了用户的激活码,那么在保存用户信息的时候,之前如下两个信息,我们没有添加进去

所以当拿到一个用户之后,我们先把激活码与唯一的一个code标识给标记上

然后再去修改dao层的save方法,改变数据插入,增加code与status这两个字段,一定要与数据库里面的字段一一匹配

​​​​​​​​​​ 

 这样才能把所有的用户信息全部插入进去,注意把相应的占位符?给添加上。

运行

下面我们就去做点击邮件然后实现激活功能

 首先创建一个ActiveUserServlet页面,

在我们做到这一步的时候,有一个问题

其中涉及到一个方法是通过codeString来查找用户,我在想要不要写到service里面,然后在dao层实现。但是一想service层里面涉及的方法,都是带有主体功能的方法,比如regist方法,后面的login方法。所以这个通过codeString查找用户这个直接做到dao层里面,然后在actice方法中调用就行。

现在去实现 service里面的active方法

然后去Dao实现这个方法的主体

​​​​​​​​

 然后再去看UserService里面的方法

 然后实现dao层里面的方法

 然后再去修改ActiveUserServlet方法

 现在去数据库里面查看一下数据

 刚刚做邮件验证的时候我发现code从页面上传输与数据库存的不一样,所以一直提示是注册失败,原因在于如下

 修改

重新启动一下服务器

 然后点击登录,进入一个login.html页面

下面来做登录功能

登录功能分析

 先来做LoginServlet页面

上面就是判断验证码,还是那句话,验证码一旦出错,程序直接over

 接着去service里面实现login登录方法

再去dao层实现findByUsernameAndPassword()

 再去返回处理servlet层

做一些常规判断,然后把数据返回

然后回到我们的login.html进行处理 

 先给登录按钮加一个id

 

 现在测试一下,验证码输入正确,用户名与密码输入错误

验证码就不试了,自行测试吧

我们现在测试一下能否登录成功这样一种环境,先去数据库看一下用户名和密码

这个登录成功就直接跳转到首页了啊 

 下面来做一个姓名提示功能

 先去看一下index.html首页

这里相当于是引入了一个头部的html文件 

 上面加载的就是header.html文件,我们直接去看header.html文件

姓名追踪功能分析:

 

第一步:修改这个位置

加一个id,然后删除信息,等会直接通过jquery来赋值 

 

 等header.html加载完成之后,直接进行一个ajax请求

下面我们要去实现FindUserServlet这部分的页面代码

 

 测试一下,重新登录

如果你重新启动了服务器,然后再次进入还没有变化的话,可能就是浏览器加了缓存,重新换个浏览器就能看到效果。

下面来做退出功能

第一步:

         

        给一个重定位,直接访问一个退出的servlet页面

         

       下面我们去编写exitServlet这个页面

        

 第二部分都是涉及到用户的行为模块,所以就先写到这 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/64912.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

痞子衡嵌入式:浅谈i.MXRT1xxx系列MCU时钟相关功能引脚的作用

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是i.MXRT1xxx系列MCU时钟相关功能引脚作用。 如果我们从一颗 MCU 芯片的引脚分类来看芯片功能,大概可以分为三大类:电源、时钟、外设功能。作为嵌入式开发者&#…

service 详解

8.3.3 HeadLiness类型的Service 在某些场景中,开发人员可能不想使用Service提供的负载均衡功能,而希望自己来控制负载均衡策略,针对这种情况,kubernetes提供了HeadLiness Service,这类Service不会分配Cluster IP&…

在线表单设计器都有哪些优秀的功能?

当前,在大数据时代的发展背景下,自定义的在线表单设计器是提升办公效率和协作效率的工具。可视化表单工具丰富的组件、简单的操作等优势特点得到了很多客户的喜爱和支持。那么,您知道在线表单设计器的功能都有哪些吗?通过这篇文章…

前端_Vue_1.初识Vue

文章目录一、前言二、开始1. 简介1.1. 什么是Vue?1.2. 渐进式框架1.3. 单文件组件1.4. API风格1.4.1. 选项式API(Options API)1.4.2. 组合式API(Composition API)1.4.3. 该选哪个?2. 快速上手(学…

导出微信通讯录

不知道什么时候,微信好友已经增加到了几百人,熟悉的、不熟悉的人都淹没在一溜的名字里,今天来整理一下微信通讯录,该删的、该分组的都搞一搞。 首先,导出微信的通讯录 单击微信左下角“菜单”,选择“设置…

为什么我们不支持手工上传镜像

自从我们提供公共镜像库以来,不少同学询问是否支持手工上传镜像到镜像库。答案是:不支持。 今天给大家聊一聊为什么公共镜像库不应该支持手工上传,主要基于以下几个方面的考量: Code First 建木作为一个完整实现GitOps理念的工…

matlab⾼级绘图时间距离图像

这限制了可能在legend上⼯作以实现⽬标的可能性。 可能的解决⽅案是按照以下步骤创建⾃⼰的基于轴的图例: 使⽤以下语法[lgd,icons,plots,txt] legend(___)创建调⽤legend函数的图例(注意,不建议使⽤此语法,我们将在后续步骤中删除图例&…

2022年HNUCM信息科学与工程学院第五届新生赛——正式赛

2022年HNUCM信息科学与工程学院第五届新生赛——正式赛 A 打卡题&#xff0c;向下取整即可 #include<iostream> using namespace std; int main() {int n;cin >> n;cout << n / 7 << endl;return 0; }B 统计数量&#xff0c;注意要是不能整除需要向…

《痞子衡嵌入式半月刊》 第 62 期

痞子衡嵌入式半月刊&#xff1a; 第 62 期 这里分享嵌入式领域有用有趣的项目/工具以及一些热点新闻&#xff0c;农历年分二十四节气&#xff0c;希望在每个交节之日准时发布一期。 本期刊是开源项目&#xff08;GitHub: JayHeng/pzh-mcu-bi-weekly&#xff09;&#xff0c;欢…

JAVA班主任管理系统(源代码+论文)

毕业综合实训报告 班主任管理系统设计与实践 目 录 摘要 ………………………………………………………………………Ⅰ &#xff08;空2行&#xff0c;本页行间距为最小值14磅&#xff09; 目录………………………………………………………………………………… 1 第1章 绪…

【QT开发笔记-基础篇】| 第五章 绘图QPainter | 5.1 效果演示、技术点

Qt 中绘图用到的类是 QPainter&#xff0c;可以实现点、线、矩形、圆形、多边形、圆弧、饼图、图片等的绘制 什么时候会用到绘图&#xff1f; 需要简单绘制时 比如&#xff0c;绘制温度的曲线时&#xff0c;如下&#xff1a; 自定义控件 绘图最大的一个应用场景就是自定义控…

三 TypeScript变量

流程控制 计算机执行程序的时候是按照从上到下从左到右逐行进行 我们常见的流程&#xff1a; 顺序 分支循环 分支结构 分支结构 单分支 语法结构 if(表达式){代码块}执行逻辑:当程序遇到if结构,首先判断表达式的值,如果表达式的值为真,则执行大括号里面的代码块,如果表达…

Spring - FactoryBean扩展接口

文章目录Preorg.springframework.beans.factory.FactoryBeanFactoryBean中的设计模式----工厂方法模式FactoryBean VS BeanFactory源码解析扩展示例Pre Spring Boot - 扩展接口一览 org.springframework.beans.factory.FactoryBean package org.springframework.beans.factory…

IDEA新建一个spark项目

第一步&#xff1a;新建一个maven工程 第二部&#xff1a;命名工程名 第三步&#xff1a;新建一个文件夹&#xff0c;并设置为sources root 第四步&#xff1a;pom编写 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http:/…

表格数据方法、分页方法及组件的封装和分页组件的复用

请假列表 1、数据获取与显示的通用方法封装 <template><div> <el-table:data"tableData"height"450"borderstyle"width: 100%":default-sort"{ prop: number, order: Ascending }"><!-- <el-table-column pr…

亚像素级精确度的角点

有时我们需要最大精度的角点检测。OpenCV为我们提供了函cv2.cornerSubPix()&#xff0c; 它可以提供亚像素级别的角点检测。下面是一个例子。首先我们要找到 Harris 角点&#xff0c;然后将角点的重心传给这个函数进行修正。Harris 角点用红色像素标出&#xff0c;绿色像素是修…

[附源码]计算机毕业设计社区疫情防控信息管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

jdk11新特性——新加的一些更实用的API

目录一、集合 增强1.1、List集合 of()方法1.2、Set集合 of()方法1.3、Map集合 of()方法1.4、List集合copyOf()方法1.5、of()和copyOf()方法创建集合的注意事项二、Stream 增强2.1、Stream 新增of()方法2.2、Stream 新增ofNullable()方法2.3、Stream 新增takeWhile() 和 dropWhi…

[附源码]Python计算机毕业设计Django网文论坛管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

torchnet简介

前言 最近项目开发过程中遇到了torchnet.metertorchnet.metertorchnet.meter来记录模型信息&#xff0c;搜了好多篇博客&#xff0c;都潦草草没有一点干货。于是参考了官方文档以及参考代码&#xff0c;根据自己的理解&#xff0c;在此做了一个其的使用教程&#xff1a; torc…