1.實(shí)現(xiàn)攔截器 Interceptor (以登錄攔截器為例)
1.1 寫一個(gè)登錄攔截器普通類
- 實(shí)現(xiàn)HandlerInterceptor接口
- 重寫preHandle方法
//檢驗(yàn)登錄狀態(tài)攔截器
//實(shí)現(xiàn)接口HandlerInterceptor 重寫方法preHandle
public class LoginInterceptor implements HandlerInterceptor {
/*
* 該方法返回為true,用戶已登錄
* 該方法返回為false,用戶未登錄
* */
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//獲取會(huì)話
HttpSession session = request.getSession(false);
if(session != null && session.getAttribute(AppVariable.USER_SESSION_KEY) != null) {
//用戶已經(jīng)登錄
return true;
}
//未登錄,則跳轉(zhuǎn)到登錄頁(yè)面
response.sendRedirect("/login.html");
return false;
}
}
2.2 設(shè)置攔截規(guī)則
- 加@Configuration注解
- 實(shí)現(xiàn)WebMvcConfigurer接口
- 重寫addInterceptors方法
//設(shè)置攔截規(guī)則
// 1. 加注解@Configuration
// 2. 實(shí)現(xiàn)接口WebMvcConfigurer 重寫方法addInterceptors
@Configuration
public class AppConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor()) //參數(shù)就是第一步的普通類
.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.時(shí)間日期格式化?
- 1. 全局日期格式化
這種方式的缺點(diǎn)是只對(duì)時(shí)間數(shù)據(jù)類型為date的生效,對(duì)于java8的LocalDate,LocalDateTime是不生效的。
- 2.局部日期格式化
全局和局部都設(shè)置時(shí),默認(rèn)是優(yōu)先局部。? 由于時(shí)間格式類型的原因,最好用如下局部這種注解,全局太局限。
?
4.JS實(shí)現(xiàn)獲取當(dāng)前ur所有參數(shù)的公共方法
//獲取當(dāng)前頁(yè)面url中的參數(shù)的公共方法
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.加密
- 該方法傳入?yún)?shù)為用戶輸入的密碼。
- 先用java自帶的UUID生成一個(gè)隨機(jī)數(shù),即是得到鹽值。
- 然后將將鹽值和用戶密碼拼接,并用MD5加密,得到MD5加密密文。
- 最后拼接鹽值和被MD5加密的密文,中間用$符連接。即得到最終要往數(shù)據(jù)庫(kù)存的密碼。該密碼由65個(gè)字符組成。共65個(gè)字符。
- 返回值為該密文。
2.模擬加密
- 該方法傳入?yún)?shù)為用戶輸入的密碼和鹽值。
- 先將將鹽值和用戶密碼拼接,并用MD5加密,得到MD5加密密文。
- 最后拼接鹽值和被MD5加密的密文,中間用$符連接。即得到密文。該密碼由65個(gè)字符組成。共65個(gè)字符。
- 返回值也為密文。
3.判斷
- 該方法傳入?yún)?shù)為用戶輸入的密碼和從數(shù)據(jù)庫(kù)中得到的密碼。
- 首先獲取鹽值,將從數(shù)據(jù)庫(kù)中得到的密碼進(jìn)行分割得到鹽值。
- 調(diào)用模擬加密方法。生成一個(gè)模擬的密文。
- 比較從數(shù)據(jù)庫(kù)中得到的密碼和模擬生成的密文是否相同。
- 返回boolean類型。
3.代碼
// 加鹽算法
public class PasswordUtils {
// 1. 加鹽并生成密碼
public static String encrypt(String password) {
// 1.產(chǎn)生鹽值 128位
String salt = UUID.randomUUID().toString().replace("-","");
// 2.拼接鹽值和密碼,再對(duì)這個(gè)整體使用md5加密,得到一個(gè)128位的密文
String saltPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes());
// 3.最終密碼格式 【128位的鹽值+$+128位的密文】 并保存到數(shù)據(jù)庫(kù) 共65個(gè)字符
String finalPassword = salt + "$" + saltPassword;
return finalPassword;
}
// 2.解密算法
// 解密還是根據(jù)用戶的密碼再次模擬生成加鹽后的密文,再對(duì)比數(shù)據(jù)庫(kù)中的密文,相同就說(shuō)明正確
// 和上面寫法一樣,只是鹽值固定了
public static String encrypt(String password,String salt) {
String saltPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes());
String finalPassword = salt + "$" + saltPassword;
return finalPassword;
}
// 3.密碼驗(yàn)證
public static boolean check(String password,String finalPassword) {
if(StringUtils.hasLength(password) && StringUtils.hasLength(finalPassword) && finalPassword.length()==65) {
//得到鹽值
String salt = finalPassword.split("\\$")[0]; //特殊字符得轉(zhuǎn)義
//重新模擬生成最終密碼
String confirmPassword = PasswordUtils.encrypt(password, salt);
return confirmPassword.equals(finalPassword);
}
return false;
}
}
7.Spring框架里自帶的加鹽算法(Spring Security)
1.引入 Spring Security 框架?
有插件在插件中搜索,沒(méi)插件去Maven倉(cāng)庫(kù)中搜索。
2.排除Spring Security框架自帶的登錄界面
3.使用
它的兩個(gè)方法跟我手寫的加鹽算法的方法的思想都比較相似 encode()對(duì)應(yīng)我的encrypt()方法,matches()對(duì)應(yīng)我的check()方法。
共60個(gè)字符組成的加密密文
8.sql語(yǔ)句分頁(yè)算法
select * from articleinfo limit M offset N;??
select * from articleinfo limit M ,N;
以上兩種分頁(yè)是完全不同的。第一種涉及分頁(yè)算法,分頁(yè)常用第一種。
第一種(offset):
M : 每頁(yè)顯示條數(shù)
N :? 由算法得出? = (當(dāng)前頁(yè)面頁(yè)數(shù)-1)* 每頁(yè)顯示條數(shù)(M)
舉例:要求每頁(yè)顯示2條數(shù)
頁(yè)數(shù) | M | N? ? ?? | 算法 |
1? ? | 2 | 0? ? ? ? ? ? | (1-1)*2 |
2?? | 2 | 2? ? ? ? | (2-1)*2 |
3 | 2 | 4 | (3-1)*2 |
select * from articleinfo limit 2 offset 0; 表示每頁(yè)顯示2條數(shù)據(jù),且當(dāng)前在第一頁(yè)
?舉例:要求每頁(yè)顯示3條數(shù)
頁(yè)數(shù) | M | N? ? ?? | 算法 |
1? ? | 3 | 0? ? ? ? ? ? | (1-1)*3 |
2?? | 3 | 3? ? ?? | (2-1)*3 |
3 | 3 | 6 | (3-1)*3 |
第二種(逗號(hào)):
select * from articleinfo limit M ,N;
M : 表示當(dāng)前從M號(hào)位置開(kāi)始查找,且M號(hào)不算,是從M+1號(hào)開(kāi)始的。
N : 總共查N條。?
即查找的范圍就是 [M+1,M+1+N] 閉區(qū)間。
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">查看全文 >></a>';
blogs += '</div>';
}
Query('#articleList').html(blogs);
}
10.驗(yàn)證碼
驗(yàn)證碼插件Hutool?文檔->Hutool參考文檔。
11.不同的數(shù)據(jù)類型使用HashMap函數(shù)統(tǒng)一返回
如下是一個(gè)list列表(列表中存儲(chǔ)對(duì)象)和一個(gè)字符串使用hashmap函數(shù)統(tǒng)一返回。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-812251.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-812251.html
到了這里,關(guān)于【常用的簡(jiǎn)單功能及算法】攔截器 加鹽算法 深克隆 時(shí)間日期格式化 加鹽算法 sql分頁(yè)算法 驗(yàn)證碼的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!