浅谈HTTP(简) 数据表单提交篇
Posted Adorable_Rocy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈HTTP(简) 数据表单提交篇相关的知识,希望对你有一定的参考价值。
前言:关于HTTP中,基本涉及到几个问题:
- 我们是如何保存用户状态的呢?
- 我们是如何控制用户状态的呢?
- 我们又是如何保证数据安全传递的呢?
- 我们是如何保证防止被篡改数据的呢?
- 我们又是如何控制多端、异地登录的呢?
基本流程图如下:
1.拦截器
@Configuration
public class LoginConfigrable implements WebMvcConfigurer {
@Autowired
UserService userService;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInteceptor(userService))
.addPathPatterns("/**")
.excludePathPatterns("/","/static/**","/login","/css/**","/js/**","/images/**","/fonts/**","/user/login","/regiest.html","/fnsregiest");
}
}
2.JWT工具类
public class JwtUtils {
/**
* 盐机制
*/
private static final String SIGN = "123H12D*&^HE";
public static final String PAYLOAD_CUSTOM ="custom ";
/**
* 获取token
* @param map 动态传入的键值对
* @return 返回token
*/
public static String getToken(Map<String , String> map){
Calendar instance = Calendar.getInstance();
instance.add(Calendar.MINUTE,60);
//创建JWT
JWTCreator.Builder builder = JWT.create();
//遍历设置键值对
map.forEach((k,v)->{
builder.withClaim(k,v);
});
//设置过期时间
builder.withExpiresAt(instance.getTime());
//设置 HMAC256认证 签名 三部分:标记使用什么算法.jwt存放数据.采用加密后的签名 (可使用Base64.decode解密)
String token = builder.sign(Algorithm.HMAC256(SIGN));
return PAYLOAD_CUSTOM + token;
}
/**
* 验证token
* @param token token令牌
* @return 返回token解码后的对象
*/
public static DecodedJWT verity(String token){
//验证签名是否被篡改
return JWT.require(Algorithm.HMAC256(SIGN)).build().verify(token);
}
}
3.MD5工具类
public class MD5Util {
public static final String MD5_SALT = "";
private final static String[] hexDigits = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d",
"e", "f" };
private Object salt;
private String algorithm;
public MD5Util(Object salt, String algorithm) {
this.salt = salt;
this.algorithm = algorithm;
}
public String encode(String rawPass) {
String result = null;
try {
MessageDigest md = MessageDigest.getInstance(algorithm);
// 加密后的字符串
result = byteArrayToHexString(md.digest(mergePasswordAndSalt(rawPass).getBytes("utf-8")));
} catch (Exception ex) {
}
return result;
}
public boolean isPasswordValid(String encPass, String rawPass) {
String pass1 = "" + encPass;
String pass2 = encode(rawPass);
return pass1.equals(pass2);
}
private String mergePasswordAndSalt(String password) {
if (password == null) {
password = "";
}
if ((salt == null) || "".equals(salt)) {
return password;
} else {
return password + "{" + salt.toString() + "}";
}
}
/**
* 转换字节数组为16进制字串
*
* @param b 字节数组
* @return 16进制字串
*/
private static String byteArrayToHexString(byte[] b) {
StringBuffer resultSb = new StringBuffer();
for (int i = 0; i < b.length; i++) {
resultSb.append(byteToHexString(b[i]));
}
return resultSb.toString();
}
private static String byteToHexString(byte b) {
int n = b;
if (n < 0) {
n = 256 + n;
}
int d1 = n / 16;
int d2 = n % 16;
return hexDigits[d1] + hexDigits[d2];
}
}
4.时间处理工具类
public class CustomDateUtils {
/**
* 日期连接符号 -
*/
public static final String C_SIGN = "-";
/**
* 日期连接符号 /
*/
public static final String C_SLASH = "/";
/**
* 日期连接符号
*/
public static final String C_NULL = "";
/**
* 周一到周日定义
*/
public static final String[][] DAY_OF_WEEK = {{"MONDAY", "一"}, {"TUESDAY", "二"}, {"WEDNESDAY", "三"}, {"THURSDAY", "四"}, {"FRIDAY", "五"}, {"SATURDAY", "六"}, {"SUNDAY", "日"}};
/**
* 日期解析格式定义
*/
private static DateTimeFormatter sdf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
/**
* 获得需要的长度的时间
* @param year 年
* @param month 月
* @param day 日
* @param hour 时
* @param min 分
* @param sec 秒
* @param markIndex 使用日期解析类型
* @param isShowText 是否显示标签
* @return
*/
public static String getCurrentTimeStander(boolean year , boolean month , boolean day , boolean hour , boolean min , boolean sec ,int markIndex,boolean isShowText){
//最终解析成的格式
String tmsReg = "";
// 符号
String sign = C_SIGN;
// 是否添加文字标注
String msgText = "";
if(isShowText){
if(markIndex == 2){
sign = C_SLASH;
}
if(markIndex == 3){
sign = C_NULL;
}
if(year){
msgText = "年";
tmsReg+="yyyy"+msgText;
}
if(month){
msgText = "月";
tmsReg = tmsReg + sign+"MM"+msgText;
}
if(day){
msgText = "日";
tmsReg = tmsReg + sign+"dd"+msgText;
}
if(hour){
msgText = "时";
tmsReg+=" HH"+msgText;
}
if(min){
msgText = "分";
tmsReg+=":mm"+msgText;
}
if(sec){
msgText = "秒";
tmsReg+=":ss"+msgText;
}
}else {
if(markIndex == 2){
sign = C_SLASH;
}
if(markIndex == 3){
sign = C_NULL;
}
if(year){
tmsReg+="yyyy"+msgText;
}
if(month){
tmsReg = tmsReg + sign+"MM";
}
if(day){
tmsReg = tmsReg + sign+"dd";
}
if(hour){
tmsReg+=" HH";
}
if(min){
tmsReg+=":mm";
}
if(sec){
tmsReg+=":ss";
}
}
if(!"".equals(tmsReg)){
SimpleDateFormat sdf = null;
sdf = new SimpleDateFormat(tmsReg);
return sdf.format(System.currentTimeMillis());
}else{
return tmsReg;
}
}
/**
* 得到当前时间
* @return
*/
public static String getCurrentTime(){
return LocalDate.now().toString();
}
/**
* 比较两个时间段的 年月日十分秒的输出
* @param startYear 开始年份
* @param startMonth 开始月份
* @param startDay 开始日期
* @param lastYaer 结束年份
* @param lastMonth 结束月份
* @param lastDay 结束日期
* @return 返回相差年份
*/
public static long diffYearTime(int startYear,int startMonth , int startDay , int lastYaer , int lastMonth , int lastDay){
return YEARS.between(LocalDate.of(startYear, startMonth, startDay), LocalDate.of(lastYaer, lastMonth, lastDay));
}
/**
* 比较两个时间段的 年月日十分秒的输出
* @param startYear 开始年份
* @param startMonth 开始月份
* @param startDay 开始日期
* @param lastYaer 结束年份
* @param lastMonth 结束月份
* @param lastDay 结束日期
* @return 返回相差月份
*/
public static long diffMonthTime(int startYear,int startMonth , int startDay , int lastYaer , int lastMonth , int lastDay){
return MONTHS.between(LocalDate.of(startYear, startMonth, startDay), LocalDate.of(lastYaer, lastMonth, lastDay));
}
/**
* 比较两个时间段的 年月日十分秒的输出
* @param startYear 开始年份
* @param startMonth 开始月份
* @param startDay 开始日期
* @param lastYaer 结束年份
* @param lastMonth 结束月份
* @param lastDay 结束日期
* @return 返回相差天数
*/
public static long diffDaysTime(int startYear,int startMonth , int startDay , int lastYaer , int lastMonth , int lastDay){
return DAYS.between(LocalDate.of(startYear, startMonth, startDay), LocalDate.of(lastYaer, lastMonth, lastDay));
}
/**
* 比较两个时间段的 年月日十分秒的输出
* @param startYear 开始年份
* @param startMonth 开始月份
* @param startDay 开始日期
* @param lastYaer 结束年份
* @param lastMonth 结束月份
* @param lastDay 结束日期
* @return 返回相差小时
*/
public static long diffHoursTime(int startYear,int startMonth , int startDay , int lastYaer , int lastMonth , int lastDay){
return HOURS.between(LocalDateTime.of(startYear, startMonth, startDay,0,0,0), LocalDateTime.of(lastYaer, lastMonth, lastDay,0,0,0));
}
/**
* 比较两个时间段的 年月日十分秒的输出
* @param startYear 开始年份
* @param startMonth 开始月份
* @param startDay 开始日期
* @param lastYaer 结束年份
* @param lastMonth 结束月份
* @param lastDay 结束日期
* @return 返回相差分钟
*/
public static long diffMinuteTime(int startYear,int startMonth , int startDay , int lastYaer , int lastMonth , int lastDay){
return MINUTES.between(LocalDateTime.of(startYear, startMonth, startDay,0,0,0), LocalDateTime.of(lastYaer, lastMonth, lastDay,0,0,0));
}
/**
* 比较两个时间段的 年月日十分秒的输出
* @param startYear 开始年份
* @param startMonth 开始月份
* @param startDay 开始日期
* @param lastYaer 结束年份
* @param lastMonth 结束月份
* @param lastDay 结束日期
* @return 返回相差秒数
*/
public static long diffSecTime(int startYear,int startMonth , int startDay , int lastYaer , int lastMonth , int lastDay){
return SECONDS.between(LocalDateTime.of(startYear, startMonth, startDay,0,0,0), LocalDateTime.of(lastYaer, lastMonth, lastDay,0,0,0));
}
/**
* 比较两个时间段的 年月日十分秒的输出
* @param startYear 开始年份
* @param startMonth 开始月份
* @param startDay 开始日期
* @param lastYaer 结束年份
* @param lastMonth 结束月份
* @param lastDay 结束日期
* @return 返回相差毫秒值
*/
public static long diffMillTime(int startYear,int startMonth , int startDay , int lastYaer , int lastMonth , int lastDay){
return MILLIS.between(LocalDateTime.of(startYear, startMonth, startDay,0,0,0), LocalDateTime.of(lastYaer, lastMonth, lastDay,0,0,0));
}
/**
* 一段时间到当前的时间
* @param year 指定年
* @param month 指定月
* @param day 指定日
* @return 指定时间到当前时间日期差
*/
public static long diffDaysToNow(int year , int month , int day){
return DAYS.between(LocalDate.of(year, month, day), LocalDate.now());
}
/**
* 一段时间到当前的时间
* @param year 指定年
* @param month 指定月
* @param day 指定日
* @return 指定时间到当前时间月份差
*/
public static long diffMonthToNow(int year , int month , int day){
return MONTHS.between(LocalDate.of(year, month, day), LocalDate.now());
}
/**
* 一段时间到当前的时间
* @param year 指定年
* @param month 指定月
* @param day 指定日
* @return 指定时间到当前时间年差
*/
public static long diffYearToNow(int year , int month , int day){
return YEARS.between(LocalDate.of(year, month, day), LocalDate.now());
}
/**
* 一段时间到当前的时间
* @param startYear 指定年
* @param startMonth 指定月
* @param startDay 指定日
* @return 指定时间到当前时间小时差
*/
public static long diffHoursToNow(int startYear,int startMonth , int startDay){
return HOURS.between(LocalDateTime.of(startYear, startMonth, startDay,0,0,0), LocalDateTime.浅谈HTTP(简)基础结构