课设搭建门户网站后端(springboot+redis)(发送邮箱(邮箱判断),文件上传(判断类型,是否重复,上传后访问不到)附源码)

news/2024/5/17 2:07:38/文章来源:https://blog.csdn.net/ningxi666/article/details/123533706

大三在学习了JavaWeb后,在学期末进行了课程设计(学习3个,其中第一个是JavaWeb,第二个基于springMVC,第3个springboot。并和舍友完成一个门户网站,负责后端编写)。在这个过程中学到了很多,限于本人水平,只用作记录和学习,如有不足,还请批评指出。

成果展示

在这里插入图片描述

问题总结与处理

1.登录注册时,希望注册时需要邮箱的验证码。
(1)生成验证码(这里截取了UUID的前六位,可自行调整)

import java.util.UUID;public class CodeUtils {public static String getUUID() {String code= UUID.randomUUID().toString();code=code.substring(0,6);return code;}
}

(2)邮箱判断

import java.util.regex.Matcher;
import java.util.regex.Pattern;public class EmailJudge {public static boolean isMail(String email){String regEx1 = "^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";Pattern p;Matcher m;p = Pattern.compile(regEx1);m = p.matcher(email);if(m.matches()){return true;}return false;}
}

(3)发送邮件(下有授权码获取方法)
这里新建一个线程完成邮箱发送操作,避免响应请求过慢。

    /***邮箱验证*/@GetMapping("/getEmail/{email}")public Result getEmail(@PathVariable String email) throws EmailException {if (EmailJudge.isMail(email)) {//判断邮件是否正确String code = CodeUtils.getUUID();//生成一个验证码new Thread(new Runnable(){@SneakyThrows@Overridepublic void run() {HtmlEmail email1 = new HtmlEmail();email1.setHostName("smtp.qq.com");email1.setCharset("utf-8");email1.addTo(email);email1.setFrom("【填写你的邮箱】", "【邮箱主题】");email1.setAuthentication("【填写你的邮箱】", "【邮箱授权码】");email1.setSubject("欢迎你注册本系统");//填写文案email1.setMsg("您的验证码为: " + code);email1.send();}}).start();return new Result(true, "验证码已发送!", code);} else {return new Result(false, "您输入的邮箱有误!", null);}}

上述发送邮件其实存在安全问题,即前端请求立即返回验证码,这样即使注册用户不看邮箱,依然可以获得验证码,可以在数据库储存邮箱验证码,这样更安全,也能控制索取验证码时间间隔
点击 授权码获得方法

2.文件上传
(1)文件上传(非空,验证,是否重复)
这里上传的是png或jpg类型的,这里的验证也是不安全的,只通过后缀判断文件类型,可以查阅更加安全的方法。通过md5加密实现判断文件是否重复,可以为文件的字节流生成一个32位的码,如果在数据库发现相同的码,那这个文件就已经上传过了

/**添加网址*/@PostMapping("/add")public Result add(@RequestParam(required = false) MultipartFile picture)throws IOException {if (!(picture ==null)) {String pictureName = picture.getOriginalFilename();//获取上传文件的名称int begin = pictureName.indexOf(".");int end = pictureName.length();String fileType = pictureName.substring(begin, end);//截取文件类型if (fileType.equals(".png") || fileType.equals(".jpg")) {String md = DigestUtils.md5Hex(picture.getBytes());//生成md5码Site site = this.siteMapper.fileJudge(md);//判断是否已上传if (site == null) {//如果未上传String local = "[文件名称]" + fileType;picture.transferTo(new File("D:\\work\\shixun\\stepTab\\src\\main\\resources\\static\\" + local));//要存放的地址return new Result(true,"添加成功",null);} else {//文件已上传,获得数据库内的图片路径pictureUrl = site.getPicture();return new Result(true,"添加成功",null);}} else {return new Result(false, "文件类型错误,请上传PNG或者JPG格式文件!", null);}} else {return new Result(false, "文件不能为空!", null);}    }         

(2)上传后访问不到
在新上传后,路径下显示文件存在,但是通过服务器却访问不到,这时重启服务器发现又可以访问到,但是不能每次都重启,我们可以通过指定静态资源访问路径来解决这个问题,这样当服务器接收到要访问静态资源的请求就会到指定路径找到图片。

首先在yml指定访问静态资源的路由前缀

spring:mvc:static-path-pattern: /picture/**

添加配置类

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* 静态资源设置
* */
@Configuration
public class ResourceConfig implements WebMvcConfigurer {@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/picture/**").//指定要处理的请求addResourceLocations("file:D:\\work\\shixun\\stepTab\\src\\main\\resources\\static\\");//告知服务器资源的地址WebMvcConfigurer.super.addResourceHandlers(registry);}
}

3.redis的简单应用
因为本系统推荐列表可能会被频繁访问,所以用Redis来进行缓存。(当然实际上本系统根本不需要redis,只是通过这次简单应用和了解redis)

yml

spring:redis:host: ip地址port: 6379password: 密码jedis:pool:max-active: 8 #最大数据库连接数max-wait: -1 #等待时间max-idle: 8 #最大空闲

配置类

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;import java.time.Duration;/*** 自定义Redis配置类,进行序列化以及RedisTemplate设置*/
@Configuration
public class RedisConfig extends CachingConfigurerSupport {/***  定制Redis API模板RedisTemplate* @param redisConnectionFactory* @return*/@Beanpublic RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {RedisTemplate<Object, Object> template = new RedisTemplate();template.setConnectionFactory(redisConnectionFactory);// 使用JSON格式序列化对象,对缓存数据key和value进行转换Jackson2JsonRedisSerializer jacksonSeial = new Jackson2JsonRedisSerializer(Object.class);// 解决查询缓存转换异常的问题ObjectMapper om = new ObjectMapper();// 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和publicom.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);// 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);jacksonSeial.setObjectMapper(om);// 设置RedisTemplate模板API的序列化方式为JSONtemplate.setDefaultSerializer(jacksonSeial);return template;}/*** 定制Redis缓存管理器RedisCacheManager,实现自定义序列化并设置缓存时效* @param redisConnectionFactory* @return*/@Beanpublic RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {// 分别创建String和JSON格式序列化对象,对缓存数据key和value进行转换RedisSerializer<String> strSerializer = new StringRedisSerializer();Jackson2JsonRedisSerializer jacksonSeial = new Jackson2JsonRedisSerializer(Object.class);// 解决查询缓存转换异常的问题ObjectMapper om = new ObjectMapper();om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);jacksonSeial.setObjectMapper(om);// 定制缓存数据序列化方式及时效RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofDays(7))   // 设置缓存有效期为1天.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(strSerializer)).serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jacksonSeial)).disableCachingNullValues();   // 对空数据不进行缓存RedisCacheManager cacheManager = RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(config).build();return cacheManager;}
}

==实际应用:当用户访问网址推荐列表时,首先查看redis中是否存在,如果存在,直接返回,如果不存在,则从数据库获取并存放到redis中 ==

     /**推荐列表*/@Overridepublic List<Site> recommendList() {List<Site> sites=null;Object o=redisTemplate.opsForValue().get("recommendList");//查找if(o!=null){sites=(List<Site>) o;}else {sites=this.siteMapper.recommendList();if (!sites.isEmpty()) {redisTemplate.opsForValue().set("recommendList", sites);//存放}}return sites;}

结语

希望我们之后都能理解底层,共同进步。
后端源码:
链接:https://pan.baidu.com/s/1uc4b_8ZgYvJKp1M9Ed9WBA
提取码:3c4d

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无需建网站,不用发帖,持续获取搜索引擎流量的方法(灰白项目皆可)

无论做什么赚钱项目&#xff0c;都需要流量&#xff0c;在线下叫客户&#xff0c;在线上叫流量。如果能搞定流量&#xff0c;无论是卖产品赚钱&#xff0c;做项目赚钱&#xff0c;还是提供服务赚钱&#xff0c;都将不在话下。可以说赚钱的过程&#xff0c;说简单点就是搞定精准…

网站可以赚钱吗(现在自己做网站还有前景吗)

在网络搜索信息泛滥成灾&#xff0c;抄袭情况严重&#xff0c;同质化网站大量存在&#xff0c;这无疑对网络搜索环境带来极大的负面影响&#xff0c;在当前不缺乏信息搜索的时代&#xff0c;想通过网站运营赚钱就必须提供有价值的内容&#xff0c;这是最基础的前提条件&#xf…

小呆聚合支付源码开源修正版支持易支付对接各大网站,APP离线完美回调

全体成员v6.4.1升级到v6.4.2 1.增加两套支付模版&#xff0c;用户可以后台自由切换模式 2.优化默认支付模版&#xff0c;增加订单来源&#xff0c;商品名称 3.增加app在各个手机上安装指引教程 4.优化其他细节 全体成员v6.4升级到v6.4.1 1.修复商户中心无法购买套餐bug 2…

CDN访问网站过程

CDN访问网站过程 ①当用户点击网站页面上的内容URL&#xff0c;经过本地DNS系统解析&#xff0c;DNS系统会最终将域名的解析权交给CNAME指向的CDN专用DNS服务器。 ②CDN的DNS服务器将CDN的全局负载均衡设备IP地址返回用户。 ③用户向CDN的全局负载均衡设备发起内容URL访问请求。…

20个居中样式的网站设计案例分享

20个居中样式的网站设计案例分享 居中是一个非常高效的平衡视觉设计方式&#xff0c;并且更容易得到反馈。随着移动互联网的发展&#xff0c;这种布局越来越受大家喜欢。本文将分享一些居中设计的网站&#xff0c;这些居中的页面元素包括heading、图片和内容区域。希望大家喜欢…

物联网从业者必须收藏的一个网站!

给大家推荐一下我基于Docusaurus构建的开源文档网站&#xff0c;喜欢的朋友可以直接从github上拉取&#xff0c;简单修改&#xff0c;构建自己的文档和博客网站。 openlinker.cn 构建个人开源文档网站&#xff0c;方便朋友们对知识做总结&#xff0c;以后应聘作用更明显^_^。 …

HTML5期末大作业:网站——餐饮网页设计(HTML+CSS+JS)

HTML5期末大作业&#xff1a;网站——餐饮网页设计(HTMLCSSJS) 临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到头大&#xff1f;HTML网页作业无从下手&#xff1f;网页要求的总数量太多&#xff1f;没有合适的模板&#xff1f;等等一系列问题。你想要解决的问题&…

最新学习java的好评网站(从入门到面试)(不止java)

最新学习java的好评网站&#xff08;从入门到面试&#xff09;&#xff08;不止java&#xff09; 编程导航CS-Notes 码农网 蓝桥云客菜鸟教程慕课网How2J的java教程W3schoolJavaGuide代码随想录总结 我们在学习java的时候&#xff0c;常常没有好的资源网站&#xff0c;学习效率…

网站一键变灰(一行代码搞定)

<style> html {filter: grayscale(1); } </style> 拿CSDN测试 为了兼容性可以加-webkit- 前缀的样式&#xff0c;放在 filter 后面&#xff1a; filter:grayscale(1);-webkit-filter:grayscale(1) 原理&#xff1a; CSS 特性 filter&#xff0c;并用了 grayscal…

微服务架构设计案例分析- 陆金所网站

前言&#xff1a;本文引用自https://www.cnblogs.com/Leo_wl/p/4917489.html 微服务架构设计案例 1. 架构的选择 小项目&#xff1a;传统的单体应用&#xff0c;将所有功能的表示层、业务逻辑层&#xff0c;数据访问层&#xff0c;包括静态资源等等全部糅合在一个工程里面&am…

LAMP架构部署和动态网站环境的配置

实验环境&#xff1a; 操作系统&#xff1a;centos 7.5 服务器IP&#xff1a;192.168.10.5 运行用户&#xff1a;root 连接工具&#xff1a;xshell工具 web环境&#xff1a;Linuxapachephpmariadb&#xff08;LAMP架构&#xff09; 大型动态应用系统平台主要是针对于大流量…

Linux中什么是动态网站环境及如何部署

当谈论起网站时&#xff0c;我们可能听说过静态和动态这两个词&#xff0c;但却不知道它们的含义&#xff0c;或者从字面意思了解一些却不知道它们的区别。 这一切可以追溯到网站和网络应用程序&#xff0c;Web应用程序是一个网站&#xff0c;但很多网站不是Web应用程序&#x…

IIS建站

这两天在工作中接触到了在xp系统下使用IIS、SQL2005、.net-frameworkv3.5架设网站工作。 遇到一些下问题&#xff0c;大概总结以下: 1、安装IIS 2、安装Microsoft .NET Framework 3.5 3、安装sql2005(安装图解:http://www.xue5.com/itedu/200707/119546.html) 如果遇到“SQ…

大学生学完python靠几个接单网站兼职,就实现了经济独立

说点想说的 程序员就是当今时代的手艺人&#xff0c;程序员可以通过个人的技术来谋生。而在工作之余接私单可以作为一种创富的途径&#xff0c;受到程序员的广泛认可。说句实在话&#xff0c;现在这个时代&#xff0c;很多人仅靠主业顶多维持基本生活&#xff0c;想让自己、家…

Python学习,不容错过的七本书籍和6个网站,免费分享

随着人工智能的到来&#xff0c;python编程语言一步登天冲到编程排行榜第一名&#xff0c;因此更多朋友想转行学习python编程语言的朋友&#xff0c;可以一起看一下&#xff1a;Python学习&#xff0c;不容错过的七本书籍和6个网站&#xff01; 入门书籍 1、《零基础入门学习…

发布网站到码云giee/用网址打开网页

准备工作: 首先需要下载git软件 Git (git-scm.com) giee没有账号的需要注册账号 https://gitee.com/ 进入网页 创建仓库 方法一&#xff1a; 利用git上传 创建完这里会有教程 设置开源 找到自己的文件根目录。 在自己的文件根目录下右键Git Bash Here&#xff0c;&#xff01;…

分享代码的添加|网站中怎么添加分享|分享代码的样式添加|分享工具的添加|网站中怎么添加分享工具...

请参考网站&#xff1a;http://www.jiathis.com/share &#xff08;所有的分享&#xff0c;可以自动生成代码&#xff0c;超简单的&#xff09; 介绍和使用&#xff1a; 分享代码的添加|网站中怎么添加分享|分享代码的样式添加|分享工具的添加|网站中怎么添加分享工具 2011-…

网创CEO网站名称的来历

开始做这个网站的时候&#xff0c;不知道搞什么域名好记&#xff0c;反正是关于到网络创业&#xff0c;资源这块&#xff0c;就开始往这方面靠&#xff0c;想了很多什么【wnagluo】相关的拼音字母结合的&#xff0c;但是感觉太长了&#xff0c;又不想太难记&#xff0c;于是就想…

外部可以访问WAMP 搭建的网站及数据库

网站修改&#xff1a; 配置文件&#xff1a;点击右下角的WAMP服务器小托盘&#xff0c;选择Apache>httpd.conf 搜索关键字 "deny from "&#xff0c;会发现一处 "denyfrom"下有一行"Allow from 127.0.0.1" &#xff0c;然后将127.0.0.1修改为…

网站电话图片采集的插件及使用

网站上的电话是图片生成的。 需要利用插件进行采集。有图有真相 接着配置采集规则 绑定采集插件 这样测试一个单页 最后导出结果 很暴力吧。嘿。