Java后端的登錄、注冊接口是怎么實現的

目錄

Java后端的登錄、注冊接口是怎么實現的

Java后端的登錄接口是怎么實現的

Java后端的注冊接口怎么實現?

如何防止SQL注入攻擊?


Java后端的登錄、注冊接口是怎么實現的

Java后端的登錄接口是怎么實現的

Java后端的登錄接口的實現方式有很多種,這里介紹其中一種常見的方式。

  1. Cookie + Session 方式:用戶輸入用戶名和密碼,前端將用戶提交的用戶名和密碼發送到后端進行驗證。如果驗證通過,后端會生成一個session id,然后將session id 以及其他用戶信息存儲在服務端的session中。同時,后端會將session id 返回給前端,前端將session id 存儲在cookie中。之后,前端每次請求時都會帶上cookie,后端會根據cookie中的session id 來判斷用戶是否已經登錄,如果已經登錄,則返回用戶信息,否則返回未登錄狀態。

  2. Token 方式:用戶輸入用戶名和密碼,前端將用戶提交的用戶名和密碼發送到后端進行驗證。如果驗證通過,后端會生成一個token,然后將token 返回給前端。之后,前端每次請求時都會帶上token,后端會根據token來判斷用戶是否已經登錄,如果已經登錄,則返回用戶信息,否則返回未登錄狀態。Token 方式相對于 Cookie + Session 方式,具有更好的可擴展性和更好的跨域支持。

基于spring boot+mybatis+vue,結合 JWT 進行 token 的生成和驗證,后端代碼可以按照以下步驟進行編寫:

  1. 添加依賴:在pom.xml文件中添加spring-boot-starter-security和jjwt依賴。

  2. 配置Spring Security:在Spring Security配置類中添加JWT過濾器,用于生成和驗證token。

  3. 編寫登錄接口:在Controller中編寫登錄接口,接收用戶名和密碼,驗證通過后生成token并返回給前端。

  4. 編寫攔截器:在攔截器中驗證token的有效性,如果token無效則返回錯誤信息。

  5. 編寫注銷接口:在Controller中編寫注銷接口,用于注銷當前用戶的token。

  6. 編寫token生成工具類:編寫一個工具類,用于生成和解析token。

  7. 編寫用戶認證邏輯:編寫用戶認證邏輯,用于驗證用戶的身份信息。

使用Spring Boot + MyBatis + JWT:

@RestController
@RequestMapping("/api")
public class LoginController {@Autowiredprivate UserService userService;@PostMapping("/login")public ResponseEntity<?> login(@RequestBody User user) {User loginUser = userService.login(user);if (loginUser != null) {String token = JWT.create().withAudience(loginUser.getId().toString()).sign(Algorithm.HMAC256(loginUser.getPassword()));return ResponseEntity.ok(token);} else {return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();}}
}
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Autowiredprivate UserService userService;@Overrideprotected void configure(HttpSecurity http) throws Exception {http.csrf().disable().authorizeRequests().antMatchers("/api/login").permitAll().anyRequest().authenticated().and().addFilter(new JWTAuthenticationFilter(authenticationManager())).addFilter(new JWTAuthorizationFilter(authenticationManager(), userService)).sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);}@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(userService).passwordEncoder(passwordEncoder());}@Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}@Overridepublic void configure(WebSecurity web) throws Exception {web.ignoring().antMatchers("/swagger-ui.html", "/swagger-resources/**", "/v2/api-docs", "/webjars/**");}
}
public class JWTAuthenticationFilter extends UsernamePasswordAuthenticationFilter {private AuthenticationManager authenticationManager;public JWTAuthenticationFilter(AuthenticationManager authenticationManager) {this.authenticationManager = authenticationManager;setFilterProcessesUrl("/api/login");}@Overridepublic Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {try {User user = new ObjectMapper().readValue(request.getInputStream(), User.class);return authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(user.getUsername(), user.getPassword()));} catch (IOException e) {throw new RuntimeException(e);}}@Overrideprotected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException, ServletException {User user = (User) authResult.getPrincipal();String token = JWT.create().withAudience(user.getId().toString()).sign(Algorithm.HMAC256(user.getPassword()));response.addHeader("Authorization", "Bearer " + token);}
}
public class JWTAuthorizationFilter extends BasicAuthenticationFilter {private UserService userService;public JWTAuthorizationFilter(AuthenticationManager authenticationManager, UserService userService) {super(authenticationManager);this.userService = userService;}@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {String header = request.getHeader("Authorization");if (header == null || !header.startsWith("Bearer ")) {chain.doFilter(request, response);return;}UsernamePasswordAuthenticationToken authenticationToken = getAuthentication(request);SecurityContextHolder.getContext().setAuthentication(authenticationToken);chain.doFilter(request, response);}private UsernamePasswordAuthenticationToken getAuthentication(HttpServletRequest request) {String token = request.getHeader("Authorization");if (token != null) {String userId = JWT.require(Algorithm.HMAC256(userService.getById(Long.parseLong(JWT.decode(token.replace("Bearer ", "")).getAudience())).getPassword())).build().verify(token.replace("Bearer ", "")).getAudience().get(0);if (userId != null) {User user = userService.getById(Long.parseLong(userId));return new UsernamePasswordAuthenticationToken(user, null, user.getAuthorities());}return null;}return null;}
}
@Service
public class UserServiceImpl implements UserService, UserDetailsService {@Autowiredprivate UserMapper userMapper;@Overridepublic User login(User user) {User loginUser = userMapper.getByUsername(user.getUsername());if (loginUser != null && new BCryptPasswordEncoder().matches(user.getPassword(), loginUser.getPassword())) {return loginUser;}return null;}@Overridepublic User getById(Long id) {return userMapper.getById(id);}@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {User user = userMapper.getByUsername(username);if (user == null) {throw new UsernameNotFoundException("User not found with username: " + username);}return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), new ArrayList<>());

Java后端的注冊接口怎么實現?

Java后端的注冊接口的實現方式有很多種,這里介紹其中一種常見的方式。

一般來說,注冊接口需要進行數據庫的基本操作,而且是前后端分離式開發。總的來說就是首先進行數據庫的設計,然后根據數據庫進行編寫服務端API接口,接著來到客戶端或移動端,進行登錄與注冊的界面設計,接收服務端提供的數據并顯示在界面上。

以下是一個簡單的注冊接口實現方式:

  1. POST請求方式:用戶輸入用戶名和密碼,前端將用戶提交的用戶名和密碼發送到后端進行驗證。如果驗證通過,后端會將用戶信息存儲在數據庫中。同時,后端會將用戶信息返回給前端,前端將用戶信息存儲在本地。之后,前端每次請求時都會帶上用戶信息,后端會根據用戶信息來判斷用戶是否已經注冊,如果已經注冊,則返回用戶信息,否則返回未注冊狀態。

如何防止SQL注入攻擊?

SQL注入攻擊是一種常見的網絡攻擊方式,它可以通過惡意的SQL語句來篡改數據庫或者獲取敏感信息。以下是一些防止SQL注入攻擊的方法:

  1. 使用參數化查詢:使用參數化查詢可以將用戶輸入的數據與SQL語句分離,從而避免了SQL注入攻擊。在Java中,可以使用PreparedStatement類來實現參數化查詢。

  2. 過濾用戶輸入:在用戶輸入數據之前,對數據進行過濾和驗證,確保數據的合法性和安全性。例如,可以使用正則表達式來限制用戶輸入的字符集。

  3. 使用ORM框架:ORM框架可以自動將用戶輸入的數據轉換為SQL語句,從而避免了手動編寫SQL語句的風險。例如,Hibernate和MyBatis都是常用的ORM框架。

  4. 限制數據庫用戶權限:將數據庫用戶的權限限制在最小范圍內,只允許其執行必要的操作,可以減少SQL注入攻擊的危害。

  5. 使用存儲過程:存儲過程可以將SQL語句封裝在一個過程中,從而避免了手動編寫SQL語句的風險。此外,存儲過程還可以提高SQL語句的執行效率。

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

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

相關文章

使用git出現的問題

保證 首先保證自己的git已經下載 其次保證自己的gitee賬號已經安裝并且已經生成ssh公鑰 保證自己要push的代碼在要上傳的文件夾內并且配置文件等都在父文件夾&#xff08;也就是文件沒有套著文件&#xff09; 問題 1 $ git push origin master gitgitee.com: Permission de…

近似同態加密的 IND/SIM-CPA+ 安全性:對于 CKKS 實際有效的攻擊

參考文獻&#xff1a; [LM21] Li B, Micciancio D. On the security of homomorphic encryption on approximate numbers[C]//Advances in Cryptology–EUROCRYPT 2021: 40th Annual International Conference on the Theory and Applications of Cryptographic Techniques, Z…

【Linux】命令expect使用詳解

&#x1f984; 個人主頁——&#x1f390;個人主頁 &#x1f390;?&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341; 感謝點贊和關注 &#xff0c;每天進步一點點&#xff01;加油&#xff01;&…

【上海大學數字邏輯實驗報告】五、記憶元件測試

一、實驗目的 掌握R-S觸發器、D觸發器和JK觸發器的工作原理及其相互轉換。學會用74LS00芯片構成鐘控RS觸發器。學會用74LS112實現D觸發器學會在Quartus II上用D觸發器實現JK觸發器。 二、實驗原理 基本R-S觸發器是直接復位-置位的觸發器&#xff0c;它是構成各種功能的觸發器…

AI文檔助手,當下熱門的AI文檔助手【2024】

在當今信息爆炸的時代&#xff0c;文檔創作的需求愈發龐大。為了滿足用戶對高效、準確、原創性文檔的需求&#xff0c;人工智能技術的應用日益廣泛。本文將專心分享AI文檔助手領域的熱門推薦。 AI文檔助手的背景與應用 AI文檔助手作為人工智能技術在文檔創作領域的一大應用&am…

nginx配置自建SSL證書

文章目錄 前言配置SSL證書SSL證書放在 Nginx 而不放在應用服務器上的好處Nginx只能轉發http協議嗎Nginx轉發TCP協議會收到端口限制嗎Nginx本身能將Websocket數據轉化成TCP數據嗎總結 前言 之前的一篇文章《自建CA并生成自簽名SSL證書》中講到為什么要自建CA和自簽名SSL證書&am…

velocity-engine-core是什么?Velocity模板引擎的使用

velocity-engine-core是什么&#xff1f;Velocity模板引擎的使用 1. 常見的模板引擎2. Velocity 的語法3.Velocity的使用 相信在日常開發中或多或少都聽過或者使用過模板引擎&#xff0c;比如熟知的freemarker, thymeleaf等。而模板引擎就是為了實現View和Data分離而產生的。 而…

C++封裝、繼承(單繼承)、多態詳細分析。

系列文章目錄 文章目錄 系列文章目錄摘要一、基本概念二、多態的分類三、多態的實現3.1 類型兼容與函數重寫3.2 動態聯編與靜態聯編3.3 虛函數3.4 動態多態的實現過程 總結參考文獻 摘要 多態性特征是 C中最為重要的一個特征&#xff0c;熟練使用多態是學好 C的關鍵&#xff0…

Kotlin關鍵字二——constructor和init

在關鍵字一——var和val中最后提到了構造函數&#xff0c;這里就學習下構造函數相關的關鍵字: constructor和init。 主要構造(primary constructor) kotlin和java一樣&#xff0c;在定義類時就自動生成了無參構造 // 會生成默認的無參構造函數 class Person{ }與java不同的是…

configure腳本的常用參數

下面是一些常用的configure選項參數及其解釋&#xff1a; --prefix<directory>&#xff1a;指定安裝目錄--with-<package>&#xff1a;指定依賴的外部庫或軟件包--enable-<feature>&#xff1a;啟用某個特性--disable-<feature>&#xff1a;禁用某個特…

原創 | 數據的確權、流通、入表與監管研究(一):數據與確權

作者&#xff1a;張建軍&#xff0c;中國電科首席專家&#xff0c;神州網信技術總監 本文約7100字&#xff0c;建議閱讀10分鐘 本文主要介紹數據與數據分類、數據確權規則、數據的所有權與其他權利等方面內容&#xff0c;并進行案例分析。 2022年12月發布的《關于構建數據基礎制…

Linux 和 macOS 的主要區別在哪幾個方面呢?

(??? )&#xff0c;Hello我是祐言QAQ我的博客主頁&#xff1a;C/C語言&#xff0c;數據結構&#xff0c;Linux基礎&#xff0c;ARM開發板&#xff0c;網絡編程等領域UP&#x1f30d;快上&#x1f698;&#xff0c;一起學習&#xff0c;讓我們成為一個強大的攻城獅&#xff0…

uniapp實戰 —— 彈出層 uni-popup (含vue3子組件調父組件的方法)

效果預覽 彈出的內容 src\pages\goods\components\ServicePanel.vue <script setup lang"ts"> // 子組件調父組件的方法 const emit defineEmits<{(event: close): void }>() </script><template><view class"service-panel"…

ALSA Compress-Offload API

概述 從 ALSA API 的早期開始&#xff0c;它就被定義為支持 PCM&#xff0c;或考慮到了 IEC61937 等固定比特率的載荷。參數和返回值以幀計算是常態&#xff0c;這使得擴展已有的 API 以支持壓縮數據流充滿挑戰。 最近這些年&#xff0c;音頻數字信號處理器 (DSP) 常常被集成…

git如何配置多個遠程倉庫,并且進行切換

一、配置多個遠程倉庫并進行切換&#xff0c;請按照以下步驟進行操作&#xff1a; 打開命令行終端&#xff0c;并進入您的 Git 倉庫所在的目錄。添加第一個遠程倉庫&#xff0c;使用以下命令&#xff1a;git remote add origin <第一個遠程倉庫的 URL>這里將遠程倉庫命名…

C# .NET平臺提取PDF表格數據,并轉換為txt、CSV和Excel表格文件

處理PDF文件中的內容是比較麻煩的事情&#xff0c;特別是以表格形式呈現的各種數據。為了充分利用這些寶貴的數據資源&#xff0c;我們可以通過程序提取PDF文件中的表格&#xff0c;并將其保存為更易于處理和分析的格式&#xff0c;如txt、csv、xlsx&#xff0c;從而更方便地對…

leetcode面試經典150題——35 螺旋矩陣

題目&#xff1a; 螺旋矩陣 描述&#xff1a; 給你一個 m 行 n 列的矩陣 matrix &#xff0c;請按照 順時針螺旋順序 &#xff0c;返回矩陣中的所有元素。 示例&#xff1a; 輸入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 輸出&#xff1a;[1,2,3,6,9,8,7,4,5] 提示&…

Redis Geo操作地理位置

Redis Geo 使用場景API列表名詞API列表Springboot使用mavenyamlTest 注意事項 Redis Geo 是Redis在3.2版本中新增的功能&#xff0c;用于存儲和操作地理位置信息 使用場景 滴滴打車&#xff1a;這是一個對地理位置精度要求較高的場景。通過使用Redis的GEO功能&#xff0c;滴滴…

12月8日作業

使用手動連接&#xff0c;將登錄框中的取消按鈕使用qt4版本的連接到自定義的槽函數中&#xff0c;在自定義的槽函數中調用關閉函數&#xff1b;將登錄按鈕使用qt5版本的連接到自定義的槽函數中&#xff0c;在槽函數中判斷u界面上輸入的賬號是否為"admin"&#xff0c;…

kafka學習筆記--安裝部署、簡單操作

本文內容來自尚硅谷B站公開教學視頻&#xff0c;僅做個人總結、學習、復習使用&#xff0c;任何對此文章的引用&#xff0c;應當說明源出處為尚硅谷&#xff0c;不得用于商業用途。 如有侵權、聯系速刪 視頻教程鏈接&#xff1a;【尚硅谷】Kafka3.x教程&#xff08;從入門到調優…