【常用的简单功能及算法】拦截器 加盐算法 深克隆 时间日期格式化 加盐算法 sql分页算法 验证码

本文主要是介绍【常用的简单功能及算法】拦截器 加盐算法 深克隆 时间日期格式化 加盐算法 sql分页算法 验证码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.实现拦截器 Interceptor (以登录拦截器为例)

1.1 写一个登录拦截器普通类

  1. 实现HandlerInterceptor接口
  2. 重写preHandle方法
//检验登录状态拦截器
//实现接口HandlerInterceptor  重写方法preHandle
public class LoginInterceptor implements HandlerInterceptor {/** 该方法返回为true,用户已登录* 该方法返回为false,用户未登录* */@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//获取会话HttpSession session = request.getSession(false);if(session != null && session.getAttribute(AppVariable.USER_SESSION_KEY) != null) {//用户已经登录return true;}//未登录,则跳转到登录页面response.sendRedirect("/login.html");return false;}
}

2.2 设置拦截规则

  1. 加@Configuration注解
  2. 实现WebMvcConfigurer接口
  3. 重写addInterceptors方法
//设置拦截规则
// 1. 加注解@Configuration
// 2. 实现接口WebMvcConfigurer 重写方法addInterceptors
@Configuration
public class AppConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LoginInterceptor()) //参数就是第一步的普通类.addPathPatterns("/**")  //先拦截全部的 再排除一些不需要拦截的.excludePathPatterns("/css/**").excludePathPatterns("/editor.md/**").excludePathPatterns("/img/**").excludePathPatterns("/js/**").excludePathPatterns("/login.html").excludePathPatterns("/reg.html").excludePathPatterns("/blog_list.html").excludePathPatterns("/blog_content.html").excludePathPatterns("/art/detail").excludePathPatterns("/user/login").excludePathPatterns("/user/reg");}
}

2.深克隆方法 (spring提供的深克隆方法)


3.时间日期格式化 

  • 1. 全局日期格式化

这种方式的缺点是只对时间数据类型为date的生效,对于java8的LocalDate,LocalDateTime是不生效的。

  • 2.局部日期格式化

全局和局部都设置时,默认是优先局部。  由于时间格式类型的原因,最好用如下局部这种注解,全局太局限。


 


4.JS实现获取当前ur所有参数的公共方法

//获取当前页面url中的参数的公共方法function getUrlVal(key) {var params = location.search;if(params.length>1) {params = location.search.substring(1);var paramArr = params.split("&");for(var i=0;i<paramArr.length;i++) {var kv = paramArr[i].split("=");if(kv[0]==key) {return kv[1];}}}return "";}

5.加密算法md5

Java自带MD5码加密。

String password = "12345";
String md5password = DigestUtils.md5DigestAsHex(password.getBytes());

6.手写加盐算法

1.加密

用java自带的UUID生成一个随机数再拼接上用户的密码,就是最终的密码。

先是生成盐值,再拼接盐值和密码,将拼接后的整体用md5加密。最后将盐值拼接$符拼接md5加密后的密文形成最终存储在数据库中的密文。共65个字符。

2.验证

首先获取盐值,拿到数据库中的密文,进行截断。

盐值知道了。再和用户登录时输入的密码一起重复上面加密操作。最终也会得到一个65个字符的密文,两个进行比较。

3.代码

// 加盐算法
public class PasswordUtils {// 1. 加盐并生成密码public static String encrypt(String password) {// 1.产生盐值 128位String salt = UUID.randomUUID().toString().replace("-","");// 2.拼接盐值和密码,再对这个整体使用md5加密,得到一个128位的密文String saltPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes());// 3.最终密码格式 【128位的盐值+$+128位的密文】 并保存到数据库 共65个字符String finalPassword = salt + "$" + saltPassword;return finalPassword;}// 2.解密算法// 解密还是根据用户的密码再次模拟生成加盐后的密文,再对比数据库中的密文,相同就说明正确// 和上面写法一样,只是盐值固定了public static String encrypt(String password,String salt) {String saltPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes());String finalPassword = salt + "$" + saltPassword;return finalPassword;}// 3.密码验证public static boolean check(String password,String finalPassword) {if(StringUtils.hasLength(password) && StringUtils.hasLength(finalPassword) && finalPassword.length()==65) {//得到盐值String salt = finalPassword.split("\\$")[0]; //特殊字符得转义//重新模拟生成最终密码String confirmPassword = PasswordUtils.encrypt(password, salt);return confirmPassword.equals(finalPassword);}return false;}}

7.Spring框架里自带的加盐算法(Spring Security)

1.引入 Spring Security 框架 

有插件在插件中搜索,没插件去Maven仓库中搜索。

2.排除Spring Security框架自带的登录界面

3.使用

它的两个方法跟我手写的加盐算法的方法的思想都比较相似 encode()对应我的encrypt()方法,matches()对应我的check()方法。

共60个字符组成的加密密文


8.sql语句分页算法

select * from articleinfo limit M offset N;  

select * from articleinfo limit M ,N;

以上两种分页是完全不同的。第一种涉及分页算法,分页常用第一种。

第一种(offset):

M : 每页显示条数

N :  由算法得出  = (当前页面页数-1)* 每页显示条数(M)

举例:要求每页显示2条数

页数MN      算法
1   20           (1-1)*2
2  22       (2-1)*2
324(3-1)*2

select * from articleinfo limit 2 offset 0; 表示每页显示2条数据,且当前在第一页

 举例:要求每页显示3条数

页数MN      算法
1   30           (1-1)*3
2  33      (2-1)*3
336(3-1)*3

第二种(逗号):

select * from articleinfo limit M ,N;

M : 表示当前从M号位置开始查找,且M号不算,是从M+1号开始的。

N : 总共查N条。 

即查找的范围就是 [M+1,M+1+N] 闭区间。


9.JS拼接代码

以返回博客列表集合为例:

success: function (result) {if(result!=null && result.code==200 && result.data.length>0) {var blogs = "";for (var i = 0; i < result.data.length; i++) {blogs += '<div class="blog">';blogs += '<div class="title">'+result.data[i].title+'</div>';blogs += '<div className="date">'+result.data[i].createtime+'</div>';blogs += '<div class="desc">'+result.data[i].content+'</div>';blogs += '<a href="blog_content.html?id='+result.data[i].id+'" class="detail">查看全文 &gt;&gt;</a>';blogs += '</div>';}Query('#articleList').html(blogs);
}

10.验证码

验证码插件Hutool 文档->Hutool参考文档。

这篇关于【常用的简单功能及算法】拦截器 加盐算法 深克隆 时间日期格式化 加盐算法 sql分页算法 验证码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/597132

相关文章

Python的Darts库实现时间序列预测

《Python的Darts库实现时间序列预测》Darts一个集统计、机器学习与深度学习模型于一体的Python时间序列预测库,本文主要介绍了Python的Darts库实现时间序列预测,感兴趣的可以了解... 目录目录一、什么是 Darts?二、安装与基本配置安装 Darts导入基础模块三、时间序列数据结构与

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

MyBatis分页查询实战案例完整流程

《MyBatis分页查询实战案例完整流程》MyBatis是一个强大的Java持久层框架,支持自定义SQL和高级映射,本案例以员工工资信息管理为例,详细讲解如何在IDEA中使用MyBatis结合Page... 目录1. MyBATis框架简介2. 分页查询原理与应用场景2.1 分页查询的基本原理2.1.1 分

MySQL的JDBC编程详解

《MySQL的JDBC编程详解》:本文主要介绍MySQL的JDBC编程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、前置知识1. 引入依赖2. 认识 url二、JDBC 操作流程1. JDBC 的写操作2. JDBC 的读操作总结前言本文介绍了mysq

java.sql.SQLTransientConnectionException连接超时异常原因及解决方案

《java.sql.SQLTransientConnectionException连接超时异常原因及解决方案》:本文主要介绍java.sql.SQLTransientConnectionExcep... 目录一、引言二、异常信息分析三、可能的原因3.1 连接池配置不合理3.2 数据库负载过高3.3 连接泄漏

MyBatis Plus实现时间字段自动填充的完整方案

《MyBatisPlus实现时间字段自动填充的完整方案》在日常开发中,我们经常需要记录数据的创建时间和更新时间,传统的做法是在每次插入或更新操作时手动设置这些时间字段,这种方式不仅繁琐,还容易遗漏,... 目录前言解决目标技术栈实现步骤1. 实体类注解配置2. 创建元数据处理器3. 服务层代码优化填充机制详

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

SpringBoot 获取请求参数的常用注解及用法

《SpringBoot获取请求参数的常用注解及用法》SpringBoot通过@RequestParam、@PathVariable等注解支持从HTTP请求中获取参数,涵盖查询、路径、请求体、头、C... 目录SpringBoot 提供了多种注解来方便地从 HTTP 请求中获取参数以下是主要的注解及其用法:1