Javaweb之Filter案例練習-自動登錄問題和MD5加密

2021-01-05 凱哥Java

自動登錄問題和MD5加密

前面已經完成了Filter的自動登錄,但是有問題,我們在web.xml中Filter的url-mapping中配置的規則是/*, 也就是這個網站的所有請求都攔截。這肯定不合適。我們本來訪問/login.jsp,本來就是去登錄,結果也進行了攔截。

解決自動登錄問題

其實,我們可以在AutoLoginFilter.java這個文件中寫if語句來判斷,雖然web.xml文件還是配置攔截/*, 但是只有在if滿足條件,才進行攔截,否則,直接放行就好。

下面if條件,我們不希望/login.jsp 和/loginServlet這兩個請求地址被攔截,所以這裡取反,使用!符號。意思就是除了這兩個之外地址都攔截。

package com.kaigejava.web.filter;

import java.io.IOException;

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.http.Cookie;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import com.anthony.domain.User;

import com.anthony.service.UserService;

import com.anthony.service.UserServiceImpl;

public class AutoLoginFilter implements Filter {

public void destroy() {

}

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

throws IOException, ServletException {

// 1 轉換兩個對象 HttpServletRequest HttpServletResponse

HttpServletRequest req = (HttpServletRequest) request;

HttpServletResponse resp = (HttpServletResponse) response;

// 優化

String uri = req.getRequestURI(); // 瀏覽器中url埠8080後面部分

String path = req.getContextPath(); // 應用名稱

path = uri.substring(path.length()); // /login.jsp

if (!("/login.jsp".equals(path)) || ("/loginServlet".equals(path))) {

// 2.處理業務, 這裡是得到cookies

// 優化

User user = (User) req.getSession().getAttribute("user");

if (user == null) { // 說明從來沒有登錄過

Cookie[] cookies = req.getCookies();

String username = "";

String password = "";

for (int i = 0; cookies != null && i < cookies.length; i++) {

if ("user".equals(cookies[i].getName())) {

String value = cookies[i].getValue(); // username&password這樣一個格式字符串

// 得到用戶名和密碼

String[] values = value.split("&");

username = values[0];

password = values[1];

}

}

UserService us = new UserServiceImpl();

User u = us.findUser(username, password);

if (u != null) { // 如果登錄成功,把用戶信息存到session中

req.getSession().setAttribute("user", u);

}

}

}

// 3.放行

chain.doFilter(request, response);

}

public void init(FilterConfig fConfig) throws ServletException {

}

}

可以再次測試下,例如在LoginServlet中或者列印用戶名和密碼欄位,可以發現只執行了一次登錄,也就是沒有被攔截。

MD5加密

第一個要知道的是MD5(Message-Digest Algoorithm 5)是一種不可逆的加密算法。也就是只能加密,不能解密操作。那麼我們登錄是如何做到呢,一般來說資料庫中用戶名密碼肯定採用MD5加密。在後臺拿到前端獲取密碼,然後把這個密碼通過MD5加密,然後傳入資料庫和密碼這欄比較,相等就說明密碼一樣。

先來看看MD5加密效果

上面這個圖是用戶密碼在資料庫中是沒有加密過的,下面我們執行把第二個用戶進行md5加密之後,看看加密之後密碼處的效果。

UPDATE users SET PASSWORD=MD5(PASSWORD) WHERE id=2;

這個一長串密碼就是MD5加密之後的效果。

Java中如何使用MD5加密

這個MD5加密方法算一個工具類吧,網上很容易搜到,下面是代碼方法

package com.anthony.util;

import java.math.BigInteger;

import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;

public class MD5Utils {

public static String md5(String plainText) {

byte[] secreBytes = null;

try {

secreBytes = MessageDigest.getInstance("md5").digest(plainText.getBytes());

}catch (NoSuchAlgorithmException e) {

throw new RuntimeException("沒有md5這個算法!");

}

String md5code = new BigInteger(1, secreBytes).toString(16);

for (int i = 0; i < 32 - md5code.length(); i++) {

md5code = "0" + md5code;

}

return md5code;

}

}

登錄過程使用加密密碼在LoginServlet.java中處理登錄,這個我們通過request.getParameter(「password」)得到的密碼肯定是明文的,這時候我們需要先給password進行MD5加密,然後進行登錄操作。(前提是用戶註冊過程中,後臺代碼在處理註冊的servlet中就把用戶密碼給進行MD5加密,然後保存在數據中的密碼就是加密的形式)

上面如果是在註冊的servlet中也這樣對password進行加密。

相關焦點

  • Javaweb之Filter案例練習-項目全局編碼過濾器
    Filter全局編碼過濾器這篇來做一個Filter在全局編碼過濾器練習,這篇新建一個web項目來做練習。web項目創建先創建一個叫GlobalFilter的web動態項目,把前面文章出現過的login.jsp複製過來,改成如下代碼。
  • Javaweb-Filter-1-快速入門
    Filter快速入門開始學習Filter這個知識點,單詞是過濾器和攔截器的作用。Filter是Javaweb中的過濾器,可以攔截所有訪問web資源的請求或響應操作。Filter這個知識點很重要,在javaweb開發中,這個是我們需要重點掌握的一個知識點。
  • 找回MD5加密的密碼及MD5加密資料庫中數據
    ('加密方式', '待加密的值'),也可以通過這種方式找回的。  DBMS_OBFUSCATION_TOOLKIT.MD5是oracle提供的獲得md5值的函數,可以直接使用DBMS_OBFUSCATION_TOOLKIT.MD5 ( input => utl_raw.cast_to_raw('預置密碼'))a FROM DUAL來得到加密後的數據,否則得到的是raw類型的數據,需要用utl_raw.cast_to_raw轉換成我們常用的md5
  • MD5加密方式
    例如我們要加密一篇文章,那麼我們會隨機從每段話或者每行中獲取一個字,把這些字統計出來後,再通過一定的運算獲得一個固定長度的MD5加密後信息。因此,其很難被逆向破解。 實質上,MD5 只是一種哈希算法。MD5有哪些特點1、針對不同長度待加密的數據、字符串等等,其都可以返回一個固定長度的MD5加密字符串。
  • javaweb學習之過濾器(Filter)的使用
    並且一個請求或一個響應都可以經過多層過濾器,如下圖所示:用途自動登錄設置統一的編碼格式,避免亂碼訪問權限的控制進行敏感字符過濾(如經常遇到的不文明發言被過濾或者以「*」的形式顯示出來)......示例這裡以一個servlet和一個filter作為示例。
  • 加密算法極先鋒之MD5算法
    在開發過程中,避免不了要涉及到數據加密,比如用戶帳號密碼的加密,用戶敏感數據的加密,涉及到的加密算法種類繁多,作為拿來主義的開發者時間精力有限,能夠清楚其中主流的加密算法和用途,就已經足夠了。主要的數據加密算法主要有:md5、sha、aes、des、rsa、base64等等。先來看看我們的老熟人:md5算法,幾乎在任何一個系統中,都少不了他的身影。MD5算法全稱叫MessageDigestAlgorithm5(信息摘要算法5),是數字摘要算法的一種實現,摘要長度為128位。
  • JavaWeb - Filter 和 Listener
    工作方式瀏覽器發出請求,過濾器對請求進行「身份認證」、「資源審核」、「資源加密訪問」等等功能,然後請求到達 Web 資源提供方。Web 資源提供方對瀏覽器請求發出響應,過濾器也對響應進行過濾,然後響應到達瀏覽器。
  • Postman使用MD5加密籤名的兩種方法
    ;5、其它常用功能如設置環境變量、暗黑模式、導出文檔等就不一一介紹了;MD5加密籤名Pre-request Script選項卡,主要用於編寫數據發送前的自定義腳本,通過一下示例來說明一下。+params.data +signKey;4、console.log("md5String---->" + md5String);定義了輸出的信息以及完整的日誌,方便分析數據和調試;5、var md5 = CryptoJS.MD5(md5String).toString();聲明了md5信息並轉換為字符串,方便和程序或服務端的籤名信息核對
  • Postman使用MD5加密籤名的兩種方法
    +params.timestamp +params.data +signKey;4、console.log(&34; + md5String);定義了輸出的信息以及完整的日誌,方便分析數據和調試;5、var md5 = CryptoJS.MD5(md5String).toString();聲明了md5信息並轉換為字符串,方便和程序或服務端的籤名信息核對
  • C Sharp程式語言如何實現MD5加密的一個實例分享
    data security inc的ronald l. rivest開發出來, 經md2、md3和md4發展而來。是加密算法嗎?不是的,md5是一種信息摘要算法,它可以從一個字符串或一個文件中按照一定的規則生成一個特殊的字符串,這個特殊的字符串就被稱之為摘要,我理解就是從文件中摘一些信息片段加工而來,並且一個文件所對應的MD5摘要是固定的,當文件內容變化後,其MD5值也會不一樣,雖然理論上來說也有可能會一樣,但概率極小,因此,在應用中經常使用MD5值來驗證一段數據有沒有被篡改。
  • Python3.7開發Django2.2 Web系統從零開始--1.9 密碼加密麼?
    在上一節實現註冊和登錄時,密碼都是明文,沒有加密的。這可是大忌,想想近幾年,數據洩露的事件還少麼?一旦資料庫被扒,密碼就明晃晃地擺在他們面前。他們就可以假冒是你,直接登錄系統,後果就不用我多說了吧,所有密碼加密是必須的。1當然,只是密碼加密還遠遠不夠地,還得思考並解決更多的安全性問題,只是這個是最基本也是比較容易實現的。
  • asp.net中的MD5加密,無碰撞不可逆,加保險更安全
    MD5的全稱是Message-Digest Algorithm 5,在90年代初由MIT的計算機科學實驗室和RSA Data Security Inc發明,經MD2、MD3和MD4發展而來。MD5將任意長度的「字節串」變換成一個128bit的大整數,並且它是一個不可逆的字符串變換算法。
  • 黑馬程式設計師:Javaweb應用中filter的執行順序解密
    1.引言我們在編寫javaweb程序的時候,時常會用filter這個組件,它能將我們一些通用邏輯抽取出來,在servlet執行業務邏輯之前運行,達到簡化代碼和復用的目的.比如最常用的場景全站編碼和登錄驗證功能.
  • 密碼存儲中MD5的安全問題與替代方案
    經過各種安全事件後,很多系統在存放密碼的時候不會直接存放明文密碼了,大都改成了存放了 md5 加密(hash)後的密碼,可是這樣真的安全嗎?> 0.28906106948853     [min] => 0.21188998222351 )   有沒有發現一個問題:MD5速度太快了,導致很容易進行暴力破解.
  • 小叮噹Python進階(二):爬蟲與加密算法Part2之MD5
    我們經常說的「MD5加密」,指的就是它---信息-摘要算法。MD5加密算法強大到,一個字符串,或文件,或壓縮包,執行MD5後,就可以生成一個固定長度為128bit的編碼串。這個編碼串,是唯一的。因此我們可以說MD5是具有不可逆性的。就像每個人都有不同的指紋,通過觀察這個人,你可以得出他的指紋等信息,並且唯一對應。
  • Python 中的加密操作 (base64、MD5)
    base64 編碼加密import base64想將字符串轉編碼成 base64, 要先將字符串轉換成二進位數據url = 「18322223360import base64url = 「aHR0cHM6Ly93d3cuY25ibG9ncy5jb20vc29uZ3poaXh1ZS8=」str_url = base64.b64decode(url).decode(「utf-8」)print(str_url)MD5 加密
  • 超棒的MD5加密工具
    MD5是一種不可逆的加密算法,全稱是Message-Digest Algorithm 5(信息-摘要算法)。是當前計算機領域用於確保信息傳輸完整一致而廣泛使用的散列算法之一。MD5的典型應用是對一段信息(Message)產生信息摘要(Message-Digest),以防止被篡改。
  • CSharp如何運用MD5算法加密密碼?
    使用MD5必須要先 using System.Security.Cryptography源碼如下:MD5 md5 =newMD5CryptoServiceProvider();//創建MDL5對象byte[] data = System.Text.Encoding.Default.GetBytes(textBox3.Text);//將字符編碼成一個字節序列
  • ASP.NET中MD5與SHA1加密的幾種方法
    MD5的全稱是Message-Digest Algorithm 5(信息-摘要算法),在90年代初由Mit Laboratory for Computer Science和Rsa data security inc的Ronald l. rivest開發出來,經md2、md3和md4發展而來。
  • 開發之核心加密解密函數authcode()介紹
    開發的使用異或運算進行加密和解密的函數,Discuz!所有產品都是用這個函數。Discuz!或者其他程序整合UCenter的同步登錄中authcode()就扮演者重要的角色。在同步登錄(從項目登錄到UCenter)的過程中,authcode()把用戶的登錄信息進行加密,因為沒有加密的數據在傳遞過程中容易被截取,這樣會暴露了用戶的信息,authcode()的作用就是給傳遞的數據提供加密保護作用。