目录
字符集转换工具
适用
代码
JWT工具类
适用
代码
七牛云文件上传工具类
适用
代码
文件类型转换工具类
适用
代码
适用
代码
字符集转换工具
适用
主要是完成与前端配合,共同实现特殊字符串传输过程中被转译的问题,比如说前端发送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);
}
}