springboot 中的 文件、短信、邮件、token 工具类
1、文件工具类
主要功能为文件上传,结合阿里云 OSS 对象存储。上传文件类型包括文档、音频、视频、图片等,可自定义文件夹,文件未加密。自动生成文件名,文件上传成功后返回原文件名、新文件名、文件大小、文件类型、文件链接等信息。
注:文件链接存在有效期,可自行设定。
添加依赖:
<dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>2.8.3</version></dependency>
public class FileUtil extends cn.hutool.core.io.FileUtil {//阿里云 OSS 对象存储private static final String END_POINT = "http://oss-cn-beijing.aliyuncs.com"; //北京private static final String ACCESS_KEY_ID = "你自己的"; //accessKeyIdprivate static final String ACCESS_KEY_SECRET = "你自己的"; //accessKeySecretprivate static final String BUCKET = "springboot-frame"; //bucketprivate static final String FILE_DIR = "admin/"; //文件保存基路径//文件类型private static final String DOCUMENT = ".doc .docx .pdf .pps .ppt .txt .xls .xlsx";private static final String MUSIC = ".aac .aif .mpa .mp3 .m4a .ra .ram .wav .wma";private static final String IMAGE = ".bmp .cdr .dib .dif .eps .gif .iff .jpeg .jpg .mpt .pcd .pcp .png .psd .tga .tif .wmf";private static final String VIDEO = ".asf .avi .flv .mov .mpe .mpeg .mpg .mp4 .m4v .ogg .ogv .qt .rm .webm .wmv";/*** 上传文件* @param fileBase64 文件的 base64格式* @param fileName 文件名(带后缀)* @return*/public static FileEntity uploadFile(String fileBase64, String fileName) {//创建阿里云客户端对象OSSClient ossClient = new OSSClient(END_POINT,ACCESS_KEY_ID,ACCESS_KEY_SECRET);FileEntity fileEntity = new FileEntity();byte[] fileByte = Base64Utils.decodeFromString(fileBase64);//获取文件后缀int lastIndexOf = fileName.lastIndexOf(".");String fileType = fileName.substring(lastIndexOf);try {//生成文件名String fileNewName = generateFileName(fileType);//将文件从 base64 格式转化成文件,以便获取文件大小等信息FileOutputStream fileOutputStream = new FileOutputStream(System.getProperty("java.io.tmpdir") + File.separator + fileNewName);fileOutputStream.write(fileByte);fileOutputStream.close();//文件输出未知为系统临时缓存目录File file = new File(System.getProperty("java.io.tmpdir") + File.separator + fileNewName);if (file.exists()) {ObjectMetadata objectMetadata = new ObjectMetadata();InputStream inputStream = new ByteArrayInputStream(fileByte);objectMetadata.setContentLength(inputStream.available());//上传文件PutObjectResult putObjectResult = ossClient.putObject(BUCKET,FILE_DIR + getFileDir(fileType) + fileNewName, inputStream, objectMetadata);//判断结果,并将文件信息返回if (StringUtil.isNotEmpty(putObjectResult.getETag())) {fileEntity.setOriginalName(fileName);fileEntity.setFileName(fileNewName);fileEntity.setFileType(getFileType(fileType));fileEntity.setFileSize(file.length() + "");fileEntity.setFilePath(getFileUrl(fileNewName));return fileEntity;} else {return null;}}} catch (Exception e) {e.printStackTrace();}return null;}/*** 判断文件上传位置(阿里云位置)* @param type* @return*/public static String getFileDir(String type) {if (DOCUMENT.contains(type)) {return "documents/";} else if (MUSIC.contains(type)) {return "musics/";} else if (IMAGE.contains(type)) {return "images/";} else if (VIDEO.contains(type)) {return "videos/";} else {return "others/";}}/*** 判断文件类型* @param type* @return*/public static String getFileType(String type) {if (DOCUMENT.contains(type)) {return "文档";} else if (MUSIC.contains(type)) {return "音频";} else if (IMAGE.contains(type)) {return "图片";} else if (VIDEO.contains(type)) {return "视频";} else {return "其它";}}/*** 生成文件名* @param fileType 文件类型* @return*/public static String generateFileName(String fileType) {SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");String date = simpleDateFormat.format(new Date());String fileName = date + fileType;return fileName;}/*** 根据文件名获取文件路径* @param fileName* @return*/public static String getFileUrl(String fileName) {OSSClient ossClient = new OSSClient(END_POINT,ACCESS_KEY_ID,ACCESS_KEY_SECRET);//链接有效期 9hDate expiration = new Date(new Date().getTime() + 9 * 60 * 60);//获取文件后缀int lastIndexOf = fileName.lastIndexOf(".");String fileType = fileName.substring(lastIndexOf);String url = ossClient.generatePresignedUrl(BUCKET,FILE_DIR + getFileDir(fileType),expiration).toString();return url;}}
测试:在实际应用中在前端将用户需要上传的文件转化成 base64 格式,然后传到后端进行上传。
public static void main(String[] args) {File file = new File("/Users/xinou/Desktop/photos/pc-one-big.jpeg");if (file.exists()) {try {FileInputStream fileInputStream = new FileInputStream(file.getPath());byte[] bytes = new byte[fileInputStream.available()];fileInputStream.read(bytes);fileInputStream.close();String s = Base64Utils.encodeToString(bytes);FileEntity fileEntity = uploadFile(s, file.getName());System.out.println(fileEntity.getOriginalName() + ", " + fileEntity.getFileName() + ", "+ fileEntity.getFileType() + ", " + fileEntity.getFileSize() + ", "+ fileEntity.getFilePath());} catch (Exception e) {e.printStackTrace();}}}
2、短信工具类
主要包括短信验证码部门。结合阿里云和腾讯云。还可有短信群发等功能。
注:阿里云需要的 code 参数的格式为字符串型,腾讯云为数组型。
添加依赖:
<!--短信验证码--><!--阿里云--><!-- https://mvnrepository.com/artifact/com.aliyun/aliyun-java-sdk-core --><dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId><version>4.1.1</version></dependency><!-- https://mvnrepository.com/artifact/com.aliyun/aliyun-java-sdk-dysmsapi --><dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-dysmsapi</artifactId><version>1.1.0</version></dependency><!--腾讯云--><!-- https://mvnrepository.com/artifact/com.github.qcloudsms/qcloudsms --><dependency><groupId>com.github.qcloudsms</groupId><artifactId>qcloudsms</artifactId><version>1.0.6</version></dependency>
public class ShortMsgUtil {private static final String ALI_PRODUCT = "你自己的"; //产品名称private static final String ALI_PRODUCT_URL = "dysmsapig.aliyuncs.com"; //产品域名private static final String ALI_ACCESS_KEY_ID = "你自己的"; //key idprivate static final String ALI_ACCESS_KEY_SECRET = "你自己的"; //key 密钥private static final String ALI_SIGN_NAME = "人世间子"; //短信签名private static final String ALI_TEMPLATE_CODE = "你自己的"; //短信模板private static final Integer TXUN_APP_ID = 你自己的; //应用 app_idprivate static final String TXUN_APP_KEY = "你自己的"; //应用 app_keyprivate static final String TXUN_SIGN_NAME_ID = "人世间子"; //签名 idprivate static final Integer TXUN_TEMPLATE_ID = 420791; //模板 idprivate static final Integer PRONHUB = 420843;private static final String TXUN_SMSG_CODE = "86"; //区号/*** 短信验证码(阿里云) 假设用户账号是手机号* @param mobile* @param code* @return 0:发送成功;1:发送失败*/public static Integer sendSMsgCodeALi(String mobile, String code) {Integer result = 1;IClientProfile iClientProfile = DefaultProfile.getProfile("cn-hangzhou", ALI_ACCESS_KEY_ID, ALI_ACCESS_KEY_SECRET);try {DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", ALI_PRODUCT, ALI_PRODUCT_URL);IAcsClient iAcsClient = new DefaultAcsClient(iClientProfile);SendSmsRequest request = new SendSmsRequest();request.setPhoneNumbers(mobile);request.setSignName(ALI_SIGN_NAME);request.setTemplateCode(ALI_TEMPLATE_CODE);request.setTemplateParam("\"code\":\"" + code + "\"}");SendSmsResponse response = iAcsClient.getAcsResponse(request);if (response.getCode() != null && "OK".equals(response.getCode())) {result = 0;} else {result = 1;}} catch(ClientException e) {e.printStackTrace();}return result;}/*** 短信验证码(腾讯云) 假设用户账号为手机号* @param mobile* @param code* @return 0:发送成功;1:发送失败*/public static Integer sendSMsgCodeTXun(String mobile, String[] code) {Integer result = 1;try {SmsSingleSender smsSingleSender = new SmsSingleSender(TXUN_APP_ID, TXUN_APP_KEY);SmsSingleSenderResult smsSingleSenderResult = smsSingleSender.sendWithParam(TXUN_SMSG_CODE,mobile, TXUN_TEMPLATE_ID, code, TXUN_SIGN_NAME_ID, "", "");result = smsSingleSenderResult.result;} catch (Exception e) {e.printStackTrace();}return result;}}
3、邮件工具类
邮件工具类包括邮箱验证码和邮箱激活链接。结合 163 邮箱。
添加依赖:
<!--发送邮件--><!-- https://mvnrepository.com/artifact/javax.mail/javax.mail-api --><dependency><groupId>javax.mail</groupId><artifactId>mail</artifactId><version>1.4.7</version></dependency>
public class EmailUtil {private static final String FROM = "香格里拉集团"; //发送方昵称;private static final String FROM_ACCOUNT = "youremail@163.com"; //发送方账号private static final String GRAN_CODE = "你自己的"; //授权码private static final String URL = "http://localhost:8081/api/admin/user/activate"; //激活链接地址 激活地址为自己项目中的 api/*** 邮件激活 假设用户账号是邮箱* @param userId* @param userName*/public static void sendActivateLik(Integer userId, String userName) {Session session = getSession();MimeMessage message = new MimeMessage(session);try {String content = "<p>您好!</p>"+ "<p> 欢迎加入香格里拉集团,请点击此链接激活账号!</p>"+ "<p> <a target='_BLANK' href='" + URL + "?=" + userId + "'>"+ URL + "?id=" + userId + "</a></p>";message.setSubject("香格里拉集团 | 账号激活"); //邮件主题message.setSentDate(new Date());message.setFrom(new InternetAddress(FROM_ACCOUNT, FROM, "UTF-8"));message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(userName));message.setContent(content, "text/html;charset=gb2312");Transport.send(message);} catch (MessagingException e) {e.printStackTrace();} catch (UnsupportedEncodingException e) {e.printStackTrace();}}/*** 邮件验证码 假设用户账号是邮箱* @param userName* @param code*/public static void sendEmailCode(String userName, String code) {Session session = getSession();MimeMessage message = new MimeMessage(session);try {String content = "<p>您好!</p>"+ "<p> 欢迎加入香格里拉集团,您的验证码为:</p>"+ "<p> " + code + "</p>";message.setSubject("香格里拉集团 | 验证码"); //邮件主题message.setSentDate(new Date());message.setFrom(new InternetAddress(FROM_ACCOUNT, FROM, "UTF-8"));message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(userName));message.setContent(content, "text/html;charset=gb2312");Transport.send(message);} catch (MessagingException e) {e.printStackTrace();} catch (UnsupportedEncodingException e) {e.printStackTrace();}}/*** 邮件配置* @return*/public static Session getSession() {Properties properties = new Properties();properties.setProperty("mail.transport.protocol", "smtp"); //指定发送邮件的邮箱协议properties.setProperty("mail.smtp.host", "smtp.163.com"); //指定smtp服务器properties.setProperty("mail.smtp.port", "25"); //端口号:25properties.setProperty("mail.smtp.auth", "true"); //指定是否需要smtp验证Session session = Session.getInstance(properties, new Authenticator() {@Overrideprotected PasswordAuthentication getPasswordAuthentication() {return new PasswordAuthentication(FROM_ACCOUNT, GRAN_CODE);}});return session;}}
4、token 工具类
token 工具类中包括生成 token 和验证 token 。
添加依赖:
<!--JWT token相关--><!-- https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt-api 编译环境 --><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-api</artifactId><version>0.10.5</version></dependency><!--运行环境--><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-impl</artifactId><version>0.10.5</version><scope>runtime</scope></dependency><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-jackson</artifactId><version>0.10.5</version><scope>runtime</scope></dependency>
public class TokenUtil {//token有效时间 两小时public static final long EXPIRE_TIME = 7200000;//签名密钥private static final String TOKEN_SECRET = "你自己的"; //秘钥可在网上在线生成,也可自己写方法生成//JWT有效private static final Integer JWT_BE_BOT_OVERDUE_CODE = 1001;//JWT过期-无效private static final Integer JWT_BE_OVERDUE_CODE = 1002;/*** 生成JWS JWT签名后称为JWS* @param subject 用户id 即生成的JWS的唯一所有人* @return*/public static String createJWS(String subject) {SecretKeySpec key = new SecretKeySpec(TOKEN_SECRET.getBytes(), "HmacSHA256"); //签名密钥long createTime = System.currentTimeMillis(); //JWT生成时间Date createDate = new Date(createTime);long expireTime = createTime + EXPIRE_TIME; //JWT有效时间Date expireDate = new Date(expireTime);JwtBuilder builder = Jwts.builder(); //new 一个JwtBuilder来设置JWT的bodybuilder.setId(getUUID()) //设置jti(JWT ID):是JWT的唯一标识,主要用来作为一次性token,从而回避重放攻击.signWith(key) //指定密钥.setIssuedAt(createDate) //JWT签发时间.setSubject(subject) //JWT的主体,即所有人,一般为userId等.setExpiration(expireDate); //失效时间return builder.compact(); //开始压缩}/*** 验证JWS* 验证JWT时的签名密钥跟生成时的签名密钥相同,且生成将其存入数据库,* 所以验证时如果抛出异常,只能是过期* @param jwsString* @return 1001:有效;1002:无效-过期*/public static Integer checkJWS(String jwsString) {SecretKeySpec key = new SecretKeySpec(TOKEN_SECRET.getBytes(), "HmacSHA256"); //签名密钥try {Jwts.parser().setSigningKey(key).parseClaimsJws(jwsString);} catch (JwtException e) {return JWT_BE_OVERDUE_CODE;}return JWT_BE_BOT_OVERDUE_CODE;}/*** 生成唯一标识* @return*/private final static String getUUID() {return UUID.randomUUID().toString().replaceAll("-", "");}}
springboot 中的 文件、短信、邮件、token 工具类相关推荐
- ThinkPHP6集成腾讯云、短信宝短信发送的工具类
composer安装 composer require mrwanghongda/sms-sdk 代码: use Mrwanghongda\SmsSdk\Sms\SmsFactory;/*** 短信宝 ...
- 调用阿里云发送短信验证码的工具类
/*** @Description 阿里云短信发送工具类* @Author 曰业而安*/ public class SendSmsUtil { //phone 手机号 //param 验证码 注意这里 ...
- C#中对文件File常用操作方法的工具类
场景 C#中File类的常用读取与写入文件方法的使用: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/99693983 注: 博客 ...
- 短信验证码生成工具类
public class ImageCodeUtil { /** * 验证码难度级别 Simple-数字 Medium-数字和小写字母 Hard-数字和大小写字母 / public enum Secu ...
- 基于阿里云的短信接口的工具类及三个jar包下载地址
https://blog.csdn.net/Mr_zzr/article/details/100168118 上面这个写的很好! 三个jar包下载地址在我的github: https://github ...
- SpringBoot整合阿里云短信服务详细过程(保证初学者也能实现)
前言 网上关于实操性的文章普遍大部分都记录不全,要么只记录重点部分,对于刚学习的小伙伴来说看起来是比较困难的 所以,基于这一点. 该文章会详细介绍使用SpringBoot整合阿里云短信服务的每一步过程 ...
- SpringBoot OAuth2.0 使用短信验证码登录授权
SpringBoot OAuth2.0 使用短信验证码登录授权 实现步骤: 自定义授权器,继承 AbstractTokenGranter 类: 重写 getOAuth2Authentication 函 ...
- 短信验证码+token唯一机制+防止重刷+幂等性
点击阅读认证服务 阿里云服务 下面截图为阿里云提供的 发送手机短信验证码的服务代码 将蓝色标记变成可配置的 怎么做?? 一个文件要是想可配置 就是从配置文件中取 首先当前的函数要和配置文件关联上 你要 ...
- SpringBoot集成阿里云短信服务
SpringBoot集成阿里云短信服务 1.准备工作 2.项目集成 2.1 添加依赖 2.2 配置文件 2.3 业务逻辑实现 在实际项目中经常有发送短信的功能,今天进说一下对接阿里云短信服务实现短信发 ...
最新文章
- Jquery各版本下载,附Jquery官网下载方法
- MongoDB(4.0)分片——大数据的处理之道
- 计算机cad论文参考文献,Auto CAD在计算机绘制矿图中的应用探索
- eclipse运行时出现Unable to execute dex
- openstack——horizon篇
- 双linux grub rescue,Grub Rescue修复方法
- variant php,Variant 是什么数据类型?
- mupdf-android-viewer 设计与实现浅析
- MUI 里js动态添加数字输入框后,增加、减少按钮无效
- showModalDialog页面
- lambda表达式对比
- 《迷宫》之站立会议—5.16
- H.264 无参考视频质量评价方法 (使用了基于遗传编程方法的符号回归)
- 如何将PDF转换成Word
- 【MODBUS】组态王通过串口与MODBUS RTU设备通讯
- 威佐夫博弈(C语言)
- 在网页中加入透明flash代码
- hdu 4517 小小明系列故事——游戏的烦恼(统计类题目)
- C#编写的通过汉字得到拼音和五笔码
- 英文数字验证码识别包
热门文章
- 关于计算机算法的ppt,中科院计算机算法分析与设计_习题3-4_答案.ppt
- 算法开发:将合并后的模型编译成动态库(so文件)提供给qt调用
- 智商黑洞(门萨Mensa测试)11
- day69 【哈希,HashSet,HashMap】
- office使用技巧大全
- JAVA java学习(9)——————java常用开发工具介绍
- UC 浏览器曝中间人攻击漏洞,官方:已修复,国内版不受影响
- 40G/100G万兆交换机如何选择?
- swing可视化编程-使用label添加图片
- mysql outer join的用法_MySQL 8 中的连接语法JOIN、OUTER JOIN的相关用法