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

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

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

  1. 实现HandlerInterceptor接口
  2. 重写preHandle方法
//检验登录状态拦截器
//实现接口HandlerInterceptor  重写方法preHandle
public class LoginInterceptor implements HandlerInterceptor {
    /*
    * 该方法返回为true,用户已登录
    * 该方法返回为false,用户未登录
    * */
    @Override
    public 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 {
    @Override
    public 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参考文档。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/312080.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

新年烟花代码-html版

新年烟花代码 效果展示 代码 <!DOCTYPE html> <html lang"en" > <head><meta charset"UTF-8"><title>2024新年快乐&#xff01;万事如意&#xff01;</title><meta name"viewport" content"width…

Java中的多线程

进程和线程的概念 进程是应用程序的执行实例有独立的内存空间和系统资源。 线程是进程中执行运算的最小单位&#xff0c;可完成一个独立的顺序控制流程 一。一个进程可以包含多个线程&#xff0c;每个线程都独立执行特定的任务&#xff0c; 是CPU调度和分派的基本单位。 多线…

2023年全国职业院校技能大赛软件测试赛题—单元测试卷⑥

单元测试 一、任务要求 题目1&#xff1a;根据下列流程图编写程序实现相应分析处理并显示结果。返回结果“ax&#xff1a;”&#xff08;x为2、3或4&#xff09;&#xff1b;其中变量x、y均须为整型。编写程序代码&#xff0c;使用JUnit框架编写测试类对编写的程序代码进行测试…

开发知识点-RabbitMQ

RabbitMQ 下载与介绍权限了解消息状态rabbitmqctl命令与操作配置常见错误常见问题日志 poc-yaml-rabbitmq-default-password 下载与介绍 RabbitMQ是一个使用Erlang语言开发 开源的消息中间件项目&#xff08;Message Broker&#xff09;&#xff0c; 采用Mozilla Public Licen…

SpringBoot用MultipartFile.transferTo传递相对路径的问题

问题描述&#xff1a; 打算给自己的项目添加一个上传文件保存功能&#xff0c;于是我使用MultipartFile.transferTo()来完成这个功能&#xff0c;由于我的项目要部署到服务器&#xff0c;所以我使用了相对路径把上传的文件保存到当前项目的工作目录下&#xff0c;但是报错了&am…

如何在 Windows 中使用Copilot AI

Windows Copilot 是 Windows 中的一个新功能&#xff0c;它可以让你与一个智能助理进行对话&#xff0c;获取信息&#xff0c;执行任务&#xff0c;甚至创造内容。Windows Copilot 使用了 Bing Chat 的技术&#xff0c;它是一个基于 OpenAI 的 GPT-4 模型的聊天机器人。 目录 …

关于树结构的数据的权限控制的算法

树结构的权限控制分两种:1、逐层加载&#xff1b;2、一次性加载 一、逐层加载 涉及的表结构 表名 T_PLAN 表字段 字段类型 是否必 须字段 说明 ID VARCHAR2(50) Y 主键 PARENT_ID VARCHAR2(50) Y 父项节点ID&#xff0c;默认根节点的父节点ID’-1’ TREEPATH VA…

vue3的福音框架arco.design

前言&#xff1a; 在vue2于2023年底正式宣布不在维护&#xff0c;vue3使用越来越频繁的时刻&#xff0c;我们实现项目的辅助框架也越来越多。element, iview, antd 等经典框架继续风靡一时&#xff0c;不过也有很多好的框架&#xff0c;功能也强大&#xff0c;比如我们今天说的…

ISO 11519-2 开环低速 CAN 网络(10K~125Kbps)

ISO 11519-2 标准的物理框图如下图 可理解为一个低速开环 CAN 总线网络&#xff1b;CAN 开环总线网络允许总线最大长度为 1km;最高速度为 125Kbps;这里的两根线是独立的&#xff0c;每根线上串联一个 2.2kΩ 的电阻&#xff1b;节点就是不同的设备&#xff0c;连接到一个开环总…

Mac上使用phpstudy+vscode配置PHP开发环境

使用的工具&#xff1a; 1、系统版本 2、vs code code 3、phpstudy_pro 一、下载vs code code以及必要的插件 1、vs code下载 点击vs code官网下载 选择对应的版本&#xff0c;一般电脑会自动识别对应的版本&#xff0c;点击下载&#xff0c;然后傻瓜式安装&#xff01; 2…

万字长文 详细讲述 计算机网络层

文章目录 网络层网络层的几个重要概念网络层的两个层面 网际协议 IP虚拟互连网络IP 地址IP 地址及其表示方法IP 地址与 MAC 地址地址解析协议 ARPIP 数据报的格式 IP层转发分组过程基于终点的转发最长前缀匹配 网际控制报文协议 ICMPICMP 报文的种类ICMP 的应用举例IPv6 的基本…

Leetcode 494 目标和

题意理解&#xff1a; 给你一个非负整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加 或 - &#xff0c;然后串联起所有整数&#xff0c;可以构造一个 表达式 &#xff1a; 例如&#xff0c;nums [2, 1] &#xff0c;可以在 2 之前添加 &#xff0c;在 1 之前添…

js更新地址栏,但是不刷新页面

记录一下第一次遇到更新地址栏但是不刷新页面的需求 有时候会遇到一些需求&#xff0c;比如复制地址&#xff0c;分享给别人 希望也保留筛选条件&#xff0c;但是之前做的时候筛选条件存储到的状态管理工具里面了&#xff0c;地址栏没有&#xff0c;所以为了更快的实现效果&am…

如何下载“ubuntu”在win10系统?

一、下载 企业开源和 Linux |Ubuntu的

解决jenkins需要jdk11,项目需要jdk8的问题

思路&#xff1a;jdk8 采用解压缩模式&#xff0c;jdk11采用安装模式&#xff0c;然后在jenkins中指定jdk路径 下载解压缩jdk8 https://www.oracle.com/java/technologies/downloads/#java8 解压缩&#xff1a;jdk-8u391-linux-i586.tar.gz /lib/ld-linux.so.2: bad ELF inte…

Realm Management Extension领域管理扩展之颗粒保护检查

本节描述了RME引入的颗粒保护检查。颗粒保护检查使得能够在不同的物理地址空间之间动态分配内存区域。 本节将向您介绍以下功能: 颗粒保护表的结构用于颗粒保护检查的故障报告区域在物理地址空间之间的过渡正如在物理地址一节中所述,RME提供了四个物理地址空间。以下图表显示…

搭建 MyBatis 环境

目录 1.添加依赖 2.数据库连接配置 3.配置XML路径 4.下载插件MyBatisX 5.如何使用 6.示例 1.添加依赖 创建新项目时添加两个依赖: MyBatis Framewrok 和 MySQL Driver 。 如果是在已经创建好的项目中配置mybatis环境。需要先下载一个插件&#xff1a;EditStarters 。 然…

JavaScript复习小案例

JavaScript实现简易留言板 效果图 完整代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>留言板</title><style>body {background-color: #f4f4f4;}/* 外部容器样式设置 */.wrapper {width: 400px;heigh…

探索 TCP 与 UDP:网络通信的两门学派(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

Vue3组件库 -- element plus 树形选择器组件怎样显示已有的树形菜单?

<el-tree-selectv-model"form.topmneu":data"tableData":props"{ label: title, value: id }":render-after-expand"false"style"width: 100%"check-strictly/> 添加 :props "{ lable : 字段名 , value: 字段…