【常用的简单功能及算法】拦截器 加盐算法 深克隆 时间日期格式化 加盐算法 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

相关文章

MySQL数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

MyBatis常用XML语法详解

《MyBatis常用XML语法详解》文章介绍了MyBatis常用XML语法,包括结果映射、查询语句、插入语句、更新语句、删除语句、动态SQL标签以及ehcache.xml文件的使用,感兴趣的朋友跟随小... 目录1、定义结果映射2、查询语句3、插入语句4、更新语句5、删除语句6、动态 SQL 标签7、ehc

深入理解Mysql OnlineDDL的算法

《深入理解MysqlOnlineDDL的算法》本文主要介绍了讲解MysqlOnlineDDL的算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小... 目录一、Online DDL 是什么?二、Online DDL 的三种主要算法2.1COPY(复制法)

mysql8.0.43使用InnoDB Cluster配置主从复制

《mysql8.0.43使用InnoDBCluster配置主从复制》本文主要介绍了mysql8.0.43使用InnoDBCluster配置主从复制,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录1、配置Hosts解析(所有服务器都要执行)2、安装mysql shell(所有服务器都要执行)3、

k8s中实现mysql主备过程详解

《k8s中实现mysql主备过程详解》文章讲解了在K8s中使用StatefulSet部署MySQL主备架构,包含NFS安装、storageClass配置、MySQL部署及同步检查步骤,确保主备数据一致... 目录一、k8s中实现mysql主备1.1 环境信息1.2 部署nfs-provisioner1.2.

MySQL中VARCHAR和TEXT的区别小结

《MySQL中VARCHAR和TEXT的区别小结》MySQL中VARCHAR和TEXT用于存储字符串,VARCHAR可变长度存储在行内,适合短文本;TEXT存储在溢出页,适合大文本,下面就来具体的了解... 目录一、VARCHAR 和 TEXT 基本介绍1. VARCHAR2. TEXT二、VARCHAR

MySQL中C接口的实现

《MySQL中C接口的实现》本节内容介绍使用C/C++访问数据库,包括对数据库的增删查改操作,主要是学习一些接口的调用,具有一定的参考价值,感兴趣的可以了解一下... 目录准备mysql库使用mysql库编译文件官方API文档对象的创建和关闭链接数据库下达sql指令select语句前言:本节内容介绍使用C/

Python打包成exe常用的四种方法小结

《Python打包成exe常用的四种方法小结》本文主要介绍了Python打包成exe常用的四种方法,包括PyInstaller、cx_Freeze、Py2exe、Nuitka,文中通过示例代码介绍的非... 目录一.PyInstaller11.安装:2. PyInstaller常用参数下面是pyinstal

使用EasyPoi快速导出Word文档功能的实现步骤

《使用EasyPoi快速导出Word文档功能的实现步骤》EasyPoi是一个基于ApachePOI的开源Java工具库,旨在简化Excel和Word文档的操作,本文将详细介绍如何使用EasyPoi快速... 目录一、准备工作1、引入依赖二、准备好一个word模版文件三、编写导出方法的工具类四、在Export

mybatis直接执行完整sql及踩坑解决

《mybatis直接执行完整sql及踩坑解决》MyBatis可通过select标签执行动态SQL,DQL用ListLinkedHashMap接收结果,DML用int处理,注意防御SQL注入,优先使用#... 目录myBATiFBNZQs直接执行完整sql及踩坑select语句采用count、insert、u