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.mzph.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;从入门到调优…