浅谈HTTP(简) 数据表单提交篇

Posted Adorable_Rocy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈HTTP(简) 数据表单提交篇相关的知识,希望对你有一定的参考价值。

前言:关于HTTP中,基本涉及到几个问题:

  1. 我们是如何保存用户状态的呢?
  2. 我们是如何控制用户状态的呢?
  3. 我们又是如何保证数据安全传递的呢?
  4. 我们是如何保证防止被篡改数据的呢?
  5. 我们又是如何控制多端、异地登录的呢?

基本流程图如下:


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(简)基础结构

浅谈HTTP(简) TCP协议

浅谈HTTP(简)TCP概念深入

ajax提交表单极简姿势

浅谈HTTP(简)HTTPS链接安全篇

浅谈HTTP(简)HTTPS链接安全篇