登錄功能和校驗

基礎版

controller

package com.web.management.controller;import com.web.management.pojo.Emp;
import com.web.management.pojo.Result;
import com.web.management.service.EmpService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;import java.util.List;@Slf4j
@RestController
public class LoginController {@Autowiredprivate EmpService  empService;@PostMapping("/login")public Result login(@RequestBody Emp emp) {log.info("登錄賬號和密碼:{}", emp);Emp e = empService.login(emp);
//        if(emp != null) {
//            return Result.success(emp);
//        }else {
//            return Result.error("賬號或密碼錯誤");
//        }return e != null?Result.success(e):Result.error("賬號或密碼錯誤");}
}

service

Emp login(Emp em);

serviceimpl

    @Overridepublic Emp login(Emp emp) {return empMapper.getByUsernameAndPassword(emp);}

mapper

    @Select("SELECT * from emp where username = #{username} and password = #{password}")Emp getByUsernameAndPassword(Emp emp);

添加依賴

在pom.xml中,記得刷新

        <!--阿里云OSS--><dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.15.1</version></dependency><dependency><groupId>javax.xml.bind</groupId><artifactId>jaxb-api</artifactId><version>2.3.1</version></dependency><dependency><groupId>javax.activation</groupId><artifactId>activation</artifactId><version>1.1.1</version></dependency><!-- no more than 2.3.3--><dependency><groupId>org.glassfish.jaxb</groupId><artifactId>jaxb-runtime</artifactId><version>2.3.3</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId></dependency><!--JWT令牌--><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency><!--fastJSON--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.76</version></dependency>

登錄校驗

cookie

package com.web.management.controller;import com.web.management.pojo.Result;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@Slf4j
@RestController
public class CookieOrSessionController {//    設置cookie@GetMapping("/c1")public Result cookie1(HttpServletResponse response) {response.addCookie(new Cookie("login_username","www123")); //設置Cookie/響應Cookiereturn Result.success();}//獲取Cookie@GetMapping("/c2")public Result cookie2(HttpServletRequest request){Cookie[] cookies = request.getCookies();for (Cookie cookie : cookies) {if(cookie.getName().equals("login_username")){System.out.println("login_username: "+cookie.getValue()); //輸出name為login_username的cookie}}return Result.success();}}

?

session

package com.web.management.controller;import com.web.management.pojo.Result;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@Slf4j
@RestController
public class CookieOrSessionController {@GetMapping("/s1")public Result session1(HttpSession session){log.info("HttpSession-s1: {}", session.hashCode());session.setAttribute("loginUser", "tom"); //往session中存儲數據return Result.success();}@GetMapping("/s2")public Result session2(HttpServletRequest request){HttpSession session = request.getSession();log.info("HttpSession-s2: {}", session.hashCode());Object loginUser = session.getAttribute("loginUser"); //從session中獲取數據log.info("loginUser: {}", loginUser);return Result.success(loginUser);}}

JWT令牌

package com.web.management.util;import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
import java.util.Map;public class JwtUtils {private static String signKey = "www123";private static Long expire = 43200000L;/*** 生成JWT令牌* @param claims JWT第二部分負載 payload 中存儲的內容* @return*/public static String generateJwt(Map<String, Object> claims){String jwt = Jwts.builder().addClaims(claims).signWith(SignatureAlgorithm.HS256, signKey).setExpiration(new Date(System.currentTimeMillis() + expire)).compact();return jwt;}/*** 解析JWT令牌* @param jwt JWT令牌* @return JWT第二部分負載 payload 中存儲的內容*/public static Claims parseJWT(String jwt){Claims claims = Jwts.parser().setSigningKey(signKey).parseClaimsJws(jwt).getBody();return claims;}
}

實現

package com.web.management.controller;import com.web.management.pojo.Emp;
import com.web.management.pojo.Result;
import com.web.management.service.EmpService;
import com.web.management.util.JwtUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;import java.util.HashMap;
import java.util.List;
import java.util.Map;@Slf4j
@RestController
public class LoginController {@Autowiredprivate EmpService  empService;@PostMapping("/login2")public Result login2(@RequestBody Emp emp) {log.info("登錄賬號和密碼:{}", emp);Emp e = empService.login(emp);if(emp != null) {Map<String , Object> claims = new HashMap<>();claims.put("id",e.getId());claims.put("name",e.getName());claims.put("username",e.getUsername());String jwt = JwtUtils.generateJwt(claims);return Result.success(jwt);}else {return Result.error("賬號或密碼錯誤");}}
}

其他層與基礎版登錄一致

過濾器Filter

package com.web.management.filter;import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;import java.io.IOException;@WebFilter(urlPatterns = "/*")
public class DemoFilter implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("攔截方法執行,攔截到了請求...");filterChain.doFilter(servletRequest, servletResponse);//放行}
}

知識點

??

實現

package com.web.management.filter;import com.alibaba.fastjson.JSONObject;
import com.google.gson.JsonObject;
import com.web.management.pojo.Result;
import com.web.management.util.JwtUtils;
import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;import java.io.IOException;@Slf4j
@WebFilter(urlPatterns = "/*")
public class LoginCheckFilter implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest req= (HttpServletRequest) servletRequest;HttpServletResponse resp= (HttpServletResponse) servletResponse;//        1、獲取請求urlString url = req.getRequestURI().toString();log.info("請求的url是:{}",url);//        2、判斷url是否為login,如果是登錄操作,放行。if (url.contains("login")) {log.info("正在進行登錄操作...");filterChain.doFilter(servletRequest, servletResponse);return;}//        3、獲取請求頭中的令牌(token)String jwt = req.getHeader("token");//        4、判斷令牌是否存在,如果不存在,返回錯誤結果(未登錄)
//        導入import org.springframework.util.StringUtils;if(!StringUtils.hasLength(jwt)){log.info("請求頭token為空,未登錄");Result error = Result.error("NOT_LOGIN");
//            手動轉換為json格式,利用阿里巴巴fastjson,導入依賴String notLogin = JSONObject.toJSONString(error);resp.getWriter().write(notLogin);return;}//        解析token,如果解析失敗,返回錯誤結果,未登錄try {JwtUtils.parseJWT(jwt);} catch (Exception e) {e.printStackTrace();log.info("解析失敗,未登錄");Result error = Result.error("NOT_LOGIN");
//            手動轉換為json格式,利用阿里巴巴fastjson,導入依賴String notLogin = JSONObject.toJSONString(error);resp.getWriter().write(notLogin);return;}//        放行log.info("令牌合法,放行");filterChain.doFilter(servletRequest, servletResponse);}
}

攔截器interceptor

要使用攔截器,記得把過濾器的注解注釋了

入門

package com.web.management.interceptor;import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;@Component
public class LoginCheckInterceptor implements HandlerInterceptor {
//目標資源方法執行前執行,返回true,放行,放回flase,不放行@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("preHandle....");return true;}
//目標資源方法執行后執行@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);}
//視圖渲染完畢后執行,最后執行@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {HandlerInterceptor.super.afterCompletion(request, response, handler, ex);}
}

package com.web.management.config;import com.web.management.interceptor.LoginCheckInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate LoginCheckInterceptor loginCheckInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {
//        設置攔截什么registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**").excludePathPatterns("/login");}
}

知識點

實現

package com.web.management.interceptor;import com.alibaba.fastjson.JSONObject;
import com.web.management.pojo.Result;
import com.web.management.util.JwtUtils;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
@Slf4j
@Component
public class LoginCheckInterceptor implements HandlerInterceptor {
//目標資源方法執行前執行,返回true,放行,放回flase,不放行@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("preHandle....");//        1、獲取請求urlString url = request.getRequestURI().toString();log.info("請求的url是:{}",url);//        2、判斷url是否為login,如果是登錄操作,放行。if (url.contains("login")) {log.info("正在進行登錄操作...");return true;}//        3、獲取請求頭中的令牌(token)String jwt = request.getHeader("token");//        4、判斷令牌是否存在,如果不存在,返回錯誤結果(未登錄)
//        導入import org.springframework.util.StringUtils;if(!StringUtils.hasLength(jwt)){log.info("請求頭token為空,未登錄");Result error = Result.error("NOT_LOGIN");
//            手動轉換為json格式,利用阿里巴巴fastjson,導入依賴String notLogin = JSONObject.toJSONString(error);response.getWriter().write(notLogin);return true;}//        解析token,如果解析失敗,返回錯誤結果,未登錄try {JwtUtils.parseJWT(jwt);} catch (Exception e) {e.printStackTrace();log.info("解析失敗,未登錄");Result error = Result.error("NOT_LOGIN");
//            手動轉換為json格式,利用阿里巴巴fastjson,導入依賴String notLogin = JSONObject.toJSONString(error);response.getWriter().write(notLogin);return true;}//        放行log.info("令牌合法,放行");return true;}
//目標資源方法執行后執行@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);}
//視圖渲染完畢后執行,最后執行@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {HandlerInterceptor.super.afterCompletion(request, response, handler, ex);}
}

關于過濾器和攔截器放行

過濾器:

filterChain.doFilter(servletRequest, servletResponse);

攔截器:

return true;

如果你覺得本文對你有用的話,請隨意打賞~

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/40013.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/40013.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/40013.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Ignis 應用: 社交 + 游戲 + 工業4.0,Ignis 構建Web3生態圈

引言 在數字經濟快速發展的今天&#xff0c;Web3技術為我們帶來了前所未有的變革。作為Ardor平臺的主要子鏈&#xff0c;Ignis公鏈在推動Web3生態系統建設中扮演了重要角色。本文將通過介紹Vessel Chain、Mythical Beings和Bridge Champ等應用&#xff0c;探討Ignis公鏈如何通…

GB/T 43566-2023中小學人造草面層足球場地檢測

人造草面層是指以類似天然草的合成纖維經機械編織固定于底布上形成人造草&#xff0c;至現場粘接并與彈性墊層等必要的其他材料組裝成整體的面層。 GB/T 43566-2023中小學人造草面層足球場地檢測項目&#xff1a; 測試項目 測試方法 人造草物理性能 GB/T 20394 人造草有害…

html+css+js文章模板

圖片 源代碼在圖片后面&#xff0c;點贊加關注&#xff0c;謝謝&#x1f604; 源代碼 <!DOCTYPE html> <html lang"zh"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width,…

redis的數據類型對應的使用場景

Redis提供了多種數據類型&#xff0c;每種數據類型都有其特定的適用場景。以下是Redis主要數據類型及其典型應用場景&#xff1a;1. 字符串(String) 應用場景&#xff1a;適用于存儲簡單的鍵值對數據&#xff0c;如用戶基本信息、計數器&#xff08;如網頁訪問次數&…

停車場車牌識別計費系統,用Python如何實現?

關注星標&#xff0c;每天學習Python新技能 前段時間練習過的一個小項目&#xff0c;今天再看看&#xff0c;記錄一下~ 項目結構 說明&#xff1a; datefile文件夾&#xff1a;保存車輛信息表的xlsx文件 file文件夾&#xff1a;保存圖片文件夾。ic_launcher.jpg是窗體的右上角…

周下載量20萬的npm包---store

https://www.npmjs.com/package/store <script setup> import { onMounted } from vue import store from storeonMounted(() > {store.set(user, { name: xutongbao })let user store.get(user)console.log(user) //對象console.log(localStorage.getItem(user)) //…

基于深度學習的換頭特效

基于深度學習的換頭特效是一項計算機視覺和圖像處理技術&#xff0c;旨在將一個人的臉部特征無縫替換到另一個人的頭部&#xff0c;同時保持自然和真實的視覺效果。這項技術廣泛應用于電影制作、虛擬現實、娛樂和社交媒體等領域。以下是關于這一領域的系統介紹&#xff1a; 1.…

linux nfs的使用

版權聲明&#xff1a;來自百度AI&#xff0c;此處記錄是方便日后查看&#xff0c;無任何商業用途 linux網絡文件共享服務之nfs NFS&#xff08;Network File System&#xff09;是一種允許計算機用戶或者操作系統通過網絡以類似本地的方式訪問文件的協議。以下是一個簡單的NF…

CesiumJS【Basic】- #056 繪制紋理填充多邊形(Entity方式)-使用shader

文章目錄 繪制紋理填充多邊形(Entity方式)-使用shader1 目標2 代碼2.1 main.ts繪制紋理填充多邊形(Entity方式)-使用shader 1 目標 使用Entity方式繪制繪制紋理填充多邊形 - 使用shader 2 代碼 2.1 main.ts import * as Cesium from cesium;const viewer = new Cesium…

搭建個人博客及錯誤記錄

搭建個人博客及錯誤記錄 文章目錄 搭建個人博客及錯誤記錄需要用到的網址2.推薦兩個參考教學視頻3.發布一篇博客個人主題配置的提醒localhost拒絕連接問題解決辦法ssh -T gitgithub.com失敗問題解決Deployer not found:git解決 可以根據目錄解決遇到的相同問題 需要用到的網址 …

朋友圈運營必備!一鍵轉發和自動轉發輕松搞定!

你還在手動發布多個微信號的朋友圈嗎&#xff1f; 現在&#xff0c;就教你一招&#xff0c;讓你輕松實現一鍵轉發和自動轉發朋友圈&#xff01; 首先&#xff0c;我們需要在個微管理系統上登錄自己的微信號&#xff0c;以便進行統一管理。這個系統可以多個微信號同時登錄&…

項目經驗-不同行業、不同風格的網站設計

網站UI設計的首要考慮點是布局與導航。合理的布局能夠確保信息清晰呈現&#xff0c;使用戶能夠快速定位所需內容。同時&#xff0c;簡潔明了的導航設計能夠引導用戶流暢瀏覽&#xff0c;減少迷失感。通過精心設計的布局和導航&#xff0c;可以提升用戶體驗&#xff0c;增強用戶…

Pointnet++改進即插即用系列:全網首發GLSA聚合和表示全局和局部空間特征|即插即用,提升特征提取模塊性能

簡介:1.該教程提供大量的首發改進的方式,降低上手難度,多種結構改進,助力尋找創新點!2.本篇文章對Pointnet++特征提取模塊進行改進,加入GLSA,提升性能。3.專欄持續更新,緊隨最新的研究內容。 目錄 1.理論介紹 2.修改步驟 2.1 步驟一 2.2 步驟二 2.3 步驟三 1.理論介…

深入剖析Tomcat(十五、十六) 關閉鉤子,保證Tomcat的正常關閉

《深入剖析Tomcat》書中第十五章講解了如何通過配置XML的方式來配置Tomcat的各個組件&#xff0c;并通過Digester庫來解析XML。我們常操作的xml文件應該就是 server.xml這個文件&#xff0c;當在一臺機器上部署多個Tomcat時&#xff0c;就必須修改連接器和 [“關閉Tomcat”程序…

網格搜索(Grid Search)及其Python和MATLAB實現

**背景&#xff1a;** 網格搜索&#xff08;Grid Search&#xff09;是一種常見的參數優化方法&#xff0c;用于在給定的參數范圍內搜索最優的參數組合&#xff0c;以優化模型的性能。該方法通過窮舉搜索參數空間中的所有可能組合&#xff0c;尋找最佳參數配置&#xff0c;是調…

Spring源碼九:BeanFactoryPostProcessor

上一篇Spring源碼八&#xff1a;容器擴展一&#xff0c;我們看到ApplicationContext容器通過refresh方法中的prepareBeanFactory方法對BeanFactory擴展的一些功能點&#xff0c;包括對SPEL語句的支持、添加屬性編輯器的注冊器擴展解決Bean屬性只能定義基礎變量的問題、以及一些…

Netty 粘包/拆包、解碼工具類

1. 概述 1.1 粘包 發送 abc def&#xff0c;接收 abcdef 原因 滑動窗口&#xff1a;假設發送方 256 bytes 表示一個完整報文&#xff0c;但由于接收方處理不及時且窗口大小足夠大&#xff0c;這 256 bytes 字節就會緩沖在接收方的滑動窗口中&#xff0c;當滑動窗口中緩沖了…

如何使用Spring Boot實現WebSocket通信

如何使用Spring Boot實現WebSocket通信 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01;今天我們將探討如何利用Spring Boot實現WebSocket通信&#xff0c;實現實…

第一周java。2

方法的作用 將重復的代碼包裝起來&#xff0c;寫成方法&#xff0c;提高代碼的復用性。 方法的語法 方法的語法格式如下 : [修飾符] 方法返回值類型 方法名(形參列表) { //由零條到多條可執行性語句組成的方法體return 返回值; } 定義方法語法格式的詳細說明如下&#xf…

模擬 ADC 的前端

ADC 的 SPICE 模擬 反復試驗的方法將信號發送到 ADC 非常耗時&#xff0c;而且可能有效也可能無效。如果轉換器捕獲電壓信息的關鍵時刻模擬輸入引腳不穩定&#xff0c;則無法獲得正確的輸出數據。SPICE 模型允許您執行的步是驗證所有模擬輸入是否穩定&#xff0c;以便沒有錯誤…