SpringBoot网站开发常用工具类(自己写的适合入门)

news2024/10/2 6:37:52

目录

字符集转换工具

适用

代码

JWT工具类

适用

代码

七牛云文件上传工具类

适用

代码

文件类型转换工具类

适用

代码

session,cookie工具类

适用

代码


字符集转换工具

适用

        主要是完成与前端配合,共同实现特殊字符串传输过程中被转译的问题,比如说前端发送axsio的时候,如果遇到了这种?#$,会被转译成特殊的一串字符和这个字符,如果后台不加处理的话是无法直接读取的,于是就有了以下的工具类,当然,前端也要写好对应的转义工具类才可以。

代码

没有什么捷径可言就是与前端商量好进行一系列转义即可

package com.scm.myblog.utils;

/**
 * 字符集过滤器
 *
 * @author Lancer
 * @date 2022/12/08
 */
public class CharsetFilterUtils {
    /**
     * tran字符集
     *
     * @param str str
     * @return {@link String}
     */
    public static String tranCharset(String str){
        if (str.indexOf("%23") >= 1) {
            str = str.replace("%23", "#");
        }
        if (str.indexOf("%2B") >= 1) {
            str = str.replace("%2B", "+");
        }
        if (str.indexOf("%2F") >= 1) {
            str = str.replace("%2F", "?");
        }
        if (str.indexOf("%26") >= 1) {
            str = str.replace("%26", "&");
        }
        if (str.indexOf("%3D") >= 1) {
            str = str.replace("%3D", "=");
        }
        return str;
    }
}

JWT工具类

适用

 JWT,不用说了,就是与检验用户身份的一个令牌,常用于一些一次性的操作,比如说一次性授权用户访问一个小时啊,什么邮箱验证了一大堆的东西。

代码

        要说思路的话,其实没什么思路,就是按照官方给的规范进行一系列设置就行了,需要注意的话,JWT生成的token是由三部分组成的第一部分头部,第二部分载荷用于储存数据用的第三部分签证就是给他搞一个签加密算法就行了,只要按这个规范书写,就可以创建一个token了,然后验证的时候也是一样的,通过获取前端传过来的token,用刚刚加密用的算法对其进行解密,然后再获取复载荷中的东西即可,当然这里还有一个设置token过期时间的问题。

package com.scm.myblog.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.TokenExpiredException;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * JwtToken生成的工具类
 * JWT token的格式:header.payload.signature
 * header的格式(算法、token的类型),默认:{"alg": "HS512","typ": "JWT"}
 * payload的格式 设置:(用户信息、创建时间、生成时间)
 * signature的生成算法:
 * HMACSHA512(base64UrlEncode(header) + "." +base64UrlEncode(payload),secret)
 */

@Component
@ConfigurationProperties(prefix = "jwt")
public class JWTUtils {

    //定义token返回头部
    public static String header;

    //token前缀
    public static String tokenPrefix;

    //签名密钥
    public static String secret;

    //有效期
    public static long expireTime;

    //存进客户端的token的key名
    public static final String USER_LOGIN_TOKEN = "USER_LOGIN_TOKEN";

    public void setHeader(String header) {
        JWTUtils.header = header;
    }

    public void setTokenPrefix(String tokenPrefix) {
        JWTUtils.tokenPrefix = tokenPrefix;
    }

    public void setSecret(String secret) {
        JWTUtils.secret = secret;
    }

    public void setExpireTime(int expireTimeInt) {
        JWTUtils.expireTime = expireTimeInt * 1000L * 60;
    }

    /**
     * 创建TOKEN
     */
    public static String createToken(String sub) {
        return tokenPrefix + JWT.create()
                //设置主题
                .withSubject(sub)
                //设置过期时间
                .withExpiresAt(new Date(System.currentTimeMillis() + expireTime))
                //设置签名算法
                .sign(Algorithm.HMAC512(secret));
    }


    /**
     * 验证token
     */
    public static String validateToken(String token) {
        try {
            //这个解密算法要和加密算法一样才可以
            return JWT.require(Algorithm.HMAC512(secret))
                    .build()
                    .verify(token.replace(tokenPrefix, ""))
                    .getSubject();
        } catch (TokenExpiredException e) {
            System.out.println("token已经过期");
        } catch (Exception e) {
            System.out.println("token验证失败");
        }
        return token;
    }

    /**
     * 检查token是否需要更新
     */
    public static boolean isNeedUpdate(String token) {
        //获取token过期时间
        Date expiresAt = null;
        try {
            expiresAt = JWT.require(Algorithm.HMAC512(secret))
                    .build()
                    .verify(token.replace(tokenPrefix, ""))
                    .getExpiresAt();
        } catch (TokenExpiredException e) {
            return true;
        } catch (Exception e) {
            System.out.println("token验证失败");
        }
        //如果剩余过期时间少于过期时常的一般时 需要更新
        assert expiresAt != null;
        return (expiresAt.getTime() - System.currentTimeMillis()) < (expireTime >> 1);
    }
}

七牛云文件上传工具类

适用

        七牛云,如果有域名的话,就可以进行一个免费的存储的,它是一种oss对象存储服务器,里面可以上传各种各样的文件,嗯,适用范围,大多数网站都会使用的,然后如果你有域名就可以免费享用15G的储存容量的。

代码

        如果想从零开始写这个工具类的话,可以看我写的这几篇文章,里面有对这个工具类的详细书写过程的记录,以及一些坑的注意。

(七牛云系列)Configuration(com.qiniu.common.Zone)‘ 已被弃用与报错,status:400, reqId:nJsAAAD_BR1IgiUX, xlog:X-Log,_桂亭亭的博客-CSDN博客_status被弃用

(七牛云系列)后端Java上传文件至七牛云(原生)_桂亭亭的博客-CSDN博客

(七牛云系列)七牛云指定文件上传路径(各种语言通用)_桂亭亭的博客-CSDN博客_七牛云上传到指定目录

package com.scm.myblog.utils;

import com.alibaba.druid.util.StringUtils;

import com.qiniu.common.QiniuException;
import com.qiniu.http.Response;
import com.qiniu.storage.BucketManager;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.Region;
import com.qiniu.storage.UploadManager;
import com.qiniu.util.Auth;

import java.io.File;
import java.io.IOException;
import java.util.UUID;


/**
 * 七牛云文件上传工具
 *
 * @author Lancer
 * @date 2022/12/08
 */
public class QiniuCloudUtil {

    // 设置AK和SK
    private static final String ACCESS_KEY = "xx";
    private static final String SECRET_KEY = "xx";
    // 要上传的空间名(存储空间)
    private static final String bucketname = "loveandlove";
    //外链域名
    private static final String domain = "cdn.forevergtt.love";
    //指定文件存储目录,没有的话可以写成空字符串
    private static final String route = "mysystem/medicine/";
    //用于拼接外链
    private static final String filelink = "http://" + domain + "/";

    // 构建密钥
    private static final Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY);


    /**
     * 上传
     *
     * @param file 文件
     * @return {@link String}
     * @throws IOException ioexception
     */
    public static String upload(File file) throws IOException {
        // 创建上传对象,Region代表存储空间所在地区
        Configuration configuration = new Configuration(Region.huanan());
        UploadManager uploadManager = new UploadManager(configuration);
        try {
            // 构建token
            String token = auth.uploadToken(bucketname);
            if (StringUtils.isEmpty(token)) {
                System.out.println("获取到token失败!");
                return "";
            }
            //构建文件名
            // 其中UUID.randomUUID()用于生成唯一的文件名
            String imageName = route + UUID.randomUUID().toString();
            //上传操作
            Response res = uploadManager.put(file, imageName, token);
            //校验返回结果
            //拼接并返回外链
            return res.statusCode == 200 ? filelink + imageName : "";
        } catch (QiniuException e) {
            Response r = e.response;
            // 请求失败时打印的异常的信息
            e.printStackTrace();
            System.out.println("error " + r.toString());
            try {
                // 响应的文本信息
                System.out.println(r.bodyString());
            } catch (QiniuException e1) {
                System.out.println("error " + e1.error());
            }
            return "";
        }
    }

    /**
     * 删除
     *
     * @param fileName 文件名称
     * @return {@link Boolean}
     * @throws IOException ioexception
     */
    public static Boolean delete(String fileName) throws IOException {
        //构造一个带指定 Region 对象的配置类
        Configuration cfg = new Configuration(Region.huanan());
        String bucket = "loveandlove";
        String key = "mysystem/medicine/" + fileName;
        Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY);
        BucketManager bucketManager = new BucketManager(auth, cfg);
        try {
            bucketManager.delete(bucket, key);
            return true;
        } catch (QiniuException ex) {
            //如果遇到异常,说明删除失败
            System.err.println(ex.code());
            System.err.println(ex.response.toString());
            return false;
        }

    }


}

文件类型转换工具类

适用

        我们知道从前端直接接收过来的文件数据类型是MultipartFile ,并不是File类型,所以在进行文件上传的时候,必须进行类型转换,要不然这个文件是无法直接上传到七牛云的oss对象存储服务器上的,所以下面的代码就实现了这种转换关系。

代码

        思路的话就是借用一个本地缓存,首先将前端拿到的这个文件对象保存在本地,然后将本地文件的路径给获取过来,然后把这个路径给我们的七牛云oss工具类即可上传文件的。

package com.scm.myblog.utils;

import org.springframework.web.multipart.MultipartFile;

import java.io.File;

import java.io.IOException;

public class UploadFileUtils {
    public static String UploadTemp(MultipartFile file) {
        String filename = file.getOriginalFilename();
        //指定上传文件本地存储目录,不存在需要提前创建
        String dirPath= null;
        dirPath = "/xx/yy/zz";
        File filePath=new File(dirPath);
        //指定上传文件本地存储目录,不存在需要提前创建
        if(!filePath.exists()){
            filePath.mkdirs();
        }
        try{
            file.transferTo(new File(dirPath,filename));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return dirPath+"\\"+filename;
    }
}

session,cookie工具类

适用

        虽然都说JWT好,但我感觉session还是割舍不掉,所以这个工具类是以前没有使用JWT时候写的,它可以实现哪些功能呢?它可以实现统计在线人数,统计在线登录的人数以及让用户强制下线,嗯,还有一些简单的设置session,获取session,设置cookie,然后解析cookie这样的一些操作。

代码

package com.scm.myblog.utils;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;

public class WebUtils {


    /**
     * 获取Cookie中指定参数的值
     */
    public static String getCookieVal(HttpServletRequest request, String cookieName) {
        Cookie[] cookies = request.getCookies();
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                if (cookie.getName().equals(cookieName)) {
                    System.out.println("Cookie中sissionid的值为:" + cookie.getValue());
                    return cookie.getValue();
                }
            }
        }
        return null;
    }

    /*判断此用户是否在线(用户不一定登陆),传入sessionid
    /
     */
    public static boolean isUserOnBlog(HttpServletRequest request, String sessionId) {
        Object map = request.getServletContext().getAttribute("map");
        String ipAddress = request.getRemoteAddr();
        if (map != null) {
            HashMap<String, List<HttpSession>> map2 = (HashMap<String, List<HttpSession>>) map;
            List<HttpSession> httpSessions = map2.get(ipAddress);
            for (HttpSession httpSession : httpSessions) {
                if (httpSession.getId().equals(sessionId)) {
                    System.out.println("上线用户为Sessionid为:" + sessionId);
                    return true;
                }
            }
        }
        return false;
    }

    //强行不让用户访问网页(用户不一定登陆),传入sessionId
    public static boolean removeUser(HttpServletRequest request, String sessionId) {
        HttpSession session = request.getSession(false);
        if (session != null) {
            //使session失效
            session.invalidate();
            System.out.println("用户离线!");
            return true;
            //失效后,需要进行的操作,List链表中需要减去,用到了Session域监听器
        }
        return false;
    }

    /*
    获取在线人数(不一定登陆)
     */
    public static int getOnInternatCount(HttpServletRequest request) {
        Object r = request.getServletContext().getAttribute("map");
        if (r != null) {
            HashMap<String, List<HttpSession>> map = (HashMap<String, List<HttpSession>>) r;
            System.out.println("在线人数为:" + map.size());
            return map.size();
        }
        return 0;
    }

    /*
    判断用户是否登陆
     */
    public static boolean isExistUserSession(HttpServletRequest request) {
        HttpSession session = request.getSession(false);
        return session.getAttribute("user") != null;
    }

    /*
    移除用户登陆
     */
    public static void removeUserSession(HttpServletRequest request) {
        HttpSession session = request.getSession();
        session.invalidate();
    }

    /*
    获取登陆人数
     */
    public static Integer getLoginCount(HttpServletRequest request) {
        Object user = request.getServletContext().getAttribute("set");
        HashSet<String> hashMap = new HashSet<String>();
        if (user != null) {
            hashMap = (HashSet<String>) user;
            System.out.println(hashMap);
            System.out.println("在线人数为:" + hashMap.size());
        }
        return hashMap.size();
    }

    /*
    设置cookie的sessionid并返回
     */
    public static Cookie setCookieIsSessionId(String sessionId) {
        Cookie cookie1 = new Cookie("JSESSIONID", sessionId);
        cookie1.setPath("/");
        cookie1.setMaxAge(60 * 60 * 10);
        return cookie1;
    }

    public static void setValBySession(HttpServletRequest request, String key, String val) {
        request.getSession().setAttribute(key, val);
    }

    public static String getValBySession(HttpServletRequest request, String key) {
        return (String) request.getSession().getAttribute(key);
    }
}

 

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

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

相关文章

数字藏品系统应用场景介绍——元宇宙NFG

数字藏品系统应用场景&#xff1a; 1.虚实结合产品营销&#xff1a;品牌企业限量发行产品&#xff0c;比如限量珍藏版产品&#xff0c;茅台酒&#xff0c;耐克鞋&#xff0c;劳力士手表&#xff0c;爱马仕包包&#xff0c;钻石珠宝&#xff0c;结合元宇宙热点营销&#xff0c;…

Crane 发布国内首个云原生应用碳排放计算优化器

为了共同应对气候变化挑战&#xff0c;减缓全球变暖趋势&#xff0c;2015年12月&#xff0c;近200个缔约方共同通过了《巴黎协定》&#xff08;The Paris Agreement&#xff09;&#xff0c;对2020年后全球如何应对气候变化做出了行动安排。为实现这一目标&#xff0c;全球多个…

我国液化石油气行业SWOT分析:产销规模持续上涨 供需缺口劣势明显

液化石油气是在炼油厂内&#xff0c;由天然气或者石油进行加压降温液化所得到的一种无色挥发性液体,它极易自燃&#xff0c;当其在空气中的含量达到了一定的浓度范围后&#xff0c;它遇到明火就能爆炸。 一、优势分析 根据观研报告网发布的《中国液化石油气市场发展深度分析与…

【Unity】UI ToolKit 学习记录

Unity推出的这个 UI ToolKit&#xff0c;据说是要用来替代UGUI。既然这么有野心&#xff0c;那肯定要搞来看一看。这次使用目标就是用这个 UI ToolKit 生成一堆类似HUD的头标&#xff0c;然后看看使用难易程度和性能如何。 本文对应Unity版本 &#xff1a;2020.3.41f1c1 1、安装…

四十六——五十一

四十六、JavaScript——对象 一、对象 数据类型&#xff1a;原始值&#xff1a; 1. 数值 Number 2. 大整数 BigInt 3. 字符串 String 4. 布尔值 Boolean 5. 空值 Null 6. 未定义 Undefinded 7. 符号 Symbol 除了七种原始值之外&#xff0c;后面所用到的数据类型&#xff0c;都…

吐槽嫌弃测试周期太长?开发自测一下

互联网产品竞争激烈&#xff0c;在生存的巨大压力之下&#xff0c;策划和运营人员们恨不得每一个需求都能秒级上线&#xff0c;这就给研发团队带来了巨大的压力。 有时候&#xff0c;产品的老大很关注某一个功能点&#xff0c;希望能尽快上线&#xff0c;可是&#xff0c;他发…

基于nodejs电影售票后台管理的设计和实现.zip(论文+源码+ppt文档+视频录制)

相关资料下载地址&#xff1a;请点击下载》》》 一、 项目介绍 5 二、 需求分析 6 1、 前端需求 6 2、 后端需求 6 3、 开发环境 7 三、 技术介绍 7 1、 Vue 7 2、 ElementUI 7 3、 NodeJS 7 4、 MySQL 8 四、 功能实现 8 1、 前端服务构建 8 2、 前端API接口封装 8 3、 前端路…

技术分享 | 掌握高频 Docker 命令,夯实内功基础

本文为霍格沃兹测试学院学院学员 Docker 实战课程学习笔记&#xff0c;供各位同学参考。 在 Dokcer 横空出世之前&#xff0c;应用打包一直是大部分研发团队的痛点。在工作中&#xff0c;面对多种服务&#xff0c;多个服务器&#xff0c;以及多种环境&#xff0c;如果还继续用传…

我的头条四面:测试工程师调岗测试开发工程师,发生了什么?

早就听说头条是算法大厂手撕代码恐怖如斯&#xff0c;进入玻璃房之前做好了心理准备&#xff0c;本次头条面试总共是四面&#xff0c;一二三技术面HR面&#xff0c;总体感觉也还不错&#xff0c;面试的是测试工程师&#xff0c;最后拿到的offer却是测试开发工程师&#xff0c;从…

Mysql主从同步时Slave_SQL_Running状态为Yes , 但是Slave_IO_Running状态为Connecting以及NO的情况故障排除

1. 环境说明 主机IP : 192.168.154.146 从机1IP : 192.168.154.147 从机2IP : 192.168.154.148 2.故障记录 当使用Navicat工具打开这三个数据库时 , 发现主库和从库的数据不同 3.排查过程-(Slave_IO_Running状态为Connecting) 3.1 网络是否互通 互ping三台机器 , 看机器…

Python自由职业可以做什么?副业月入3000的快乐你根本想象不到

很多有时间的程序员都会在业余时间接一些“私活”&#xff0c;也就是我们说的副业&#xff01; 毕竟虽然程序员加班时间长&#xff0c;但是也不是所有程序员都是需要997的…许多事业编制或者说一部分公司并不会出现特别夸张的加班时长。平常周末的时候也就会接一些副业&#x…

如何用Python操作PDF制作数据报告?

大家好&#xff0c;你是否会发现 Python 操作PDF文档内容&#xff0c;主要围绕PDF文档的内容提取、合并与拆分、加密与解密、添加水印以及不同文档格式相互转换来展开。 但大家会发现&#xff0c;其中并没有有太多直接操作PDF并向其写入的内容。这是因为我们更推荐大家Python自…

C语言练习之计算一个数的每位之和(递归实现)

目录 前言 一、思路 二、源代码以及运行截图 源代码&#xff1a; 运行截图&#xff1a; 总结 前言 写一个递归函数DigitSum(n)&#xff0c;输入一个非负整数&#xff0c;返回组成它的数字之和 例如&#xff0c;调用DigitSum(1729)&#xff0c;则应该返回1 7 2 9&#…

LeetCode HOT 100 —— 297.二叉树的序列化与反序列化

题目 序列化是将一个数据结构或者对象转换为连续的比特位的操作&#xff0c;进而可以将转换后的数据存储在一个文件或者内存中&#xff0c;同时也可以通过网络传输到另一个计算机环境&#xff0c;采取相反方式重构得到原数据。 请设计一个算法来实现二叉树的序列化与反序列化。…

你还以为格子衫头发的就是程序员?这些特征都没有别说你是程序员

周一写几百个bug&#xff0c;周二到周四拼命改bug&#xff0c;周五总结bug&#xff0c;总结的好有周末&#xff0c;总结的不好周末无休&#xff01; 咳咳&#xff0c;这样的周末我可以不休息&#xff01; 有很多想要学习Python却找不到途径的朋友&#xff0c;我这里整理了一…

.NET Framework杂记

这篇博客主要记录在用C#编写上位机时&#xff0c;不会的知识点&#xff0c;随时更新&#xff0c;方便查阅。 C#语法操作杂记c#中让textbox选中不选中C#无法使用实例引用来访问成员解决方法针对不同定义情况的引用解释C# 字符串分割用字符串分割用多个字符串分割用单字符分割C#中…

【DevOps实战系列】第二章:详解Gitlab环境及搭建

个人亲自录制全套DevOps系列实战教程 &#xff1a;手把手教你玩转DevOps全栈技术 gitlab就不多说了&#xff0c;这个东西现在大多数公司内部都在使用&#xff0c;它分为社区和企业版本&#xff0c;社区版本ce是免费的&#xff0c;当然也可以选择gitee或github&#xff0c;但由于…

非零基础自学Golang 第8章 包管理 8.6 包的命名 8.7 依赖包管理

非零基础自学Golang 文章目录非零基础自学Golang第8章 包管理8.6 包的命名8.7 依赖包管理第8章 包管理 8.6 包的命名 每个包都有一个包名&#xff0c;包名一般是短小的名字&#xff0c;在包的声明处指定。 通常来说&#xff0c;默认的包名就是包导入路径名的最后一段&#x…

AD20和立创EDA设计(5)立创EDA导出3D模型放入AD20使用

&#xff08;1&#xff09;本文主要介绍如何将从立创EDA导出的3D模型&#xff0c;并且对3D模型进行处理。 &#xff08;2&#xff09;需提前观看&#xff1a;AD20和立创EDA设计&#xff08;4&#xff09;PCB设计&#xff1b; &#xff08;3&#xff09;本文需要使用到Fusion 36…

基于6自由度飞行器的EKF和INS融合算法的MATLAB仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 六自由度四轴飞行器,包括由四根杆组成的正四面体,所述正四面体的中心位置设有一个空心圆球,空心圆球上设有四根支杆分别与正四面体的四个顶点相连,所述空心圆球内设有电池和控制系统, INS/GPS的松…