当前位置: 首页 > news >正文

怀化seo快速排名长沙网站优化外包服务

怀化seo快速排名,长沙网站优化外包服务,网站建设为什么有些100元的,昆明网约车公司排行榜目录 1. JWT的结构2. JWT的优点3. JWT的流转过程4.具体案例一、项目结构二、依赖配置三、用户模型四、JWT工具类五、JWT请求过滤器六、安全配置七、身份验证控制器八、测试JWT JWT#xff08;JSON Web Token#xff09;是一种开放标准#xff08;RFC 7519#xff09;#… 目录 1. JWT的结构2. JWT的优点3. JWT的流转过程4.具体案例一、项目结构二、依赖配置三、用户模型四、JWT工具类五、JWT请求过滤器六、安全配置七、身份验证控制器八、测试JWT JWTJSON Web Token是一种开放标准RFC 7519用于在网络应用环境间以紧凑的方式安全地传递信息。JWT可以被用作身份验证和信息交换的手段特别适合用于前后端分离的应用程序。 1. JWT的结构 JWT由三部分组成 Header头部: 通常包含令牌的类型JWT和所使用的签名算法如HMAC SHA256或RSA。 Payload负载: 包含声明claims即要传递的数据。其中可以包含注册声明如 iss、exp、sub 等和自定义声明。 Signature签名: 用于验证消息的完整性和发送者的身份。通过将编码后的header和payload与一个密钥结合利用指定的算法生成。 JWT的格式如下 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c2. JWT的优点 无状态: 不需要在服务器存储会话信息减轻了服务器的负担。跨域: 可以在不同的域之间进行身份验证。自包含: 含有用户身份信息避免频繁查询数据库。 3. JWT的流转过程 用户通过登录接口发送用户名和密码。服务器验证用户信息如果成功则生成JWT并返回给用户。用户在后续请求中带上JWT通常放在HTTP请求的Authorization头中。服务器解析JWT验证其有效性允许或拒绝请求。 4.具体案例 好的让我们更详细地探讨如何在Java Spring Boot应用程序中实现JWT身份验证包括每一步的代码和说明。 一、项目结构 Spring Boot项目结构如下 src ├── main │ ├── java │ │ └── com │ │ └── example │ │ └── jwt │ │ ├── JwtApplication.java │ │ ├── config │ │ │ └── SecurityConfig.java │ │ ├── controller │ │ │ └── AuthController.java │ │ ├── model │ │ │ └── User.java │ │ ├── service │ │ │ └── JwtUtil.java │ │ └── filter │ │ └── JwtRequestFilter.java │ └── resources │ └── application.properties └── test二、依赖配置 在pom.xml中添加必要的依赖 dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-security/artifactId/dependencydependencygroupIdio.jsonwebtoken/groupIdartifactIdjjwt/artifactIdversion0.9.1/version/dependency /dependencies三、用户模型 创建一个简单的用户模型 package com.example.jwt.model;public class User {private String username;private String password;// Constructors, getters, and setters//也可以使用Lombokpublic User(String username, String password) {this.username username;this.password password;}public String getUsername() {return username;}public String getPassword() {return password;} }四、JWT工具类 创建JWT工具类负责生成和解析JWT package com.example.jwt.service;import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import org.springframework.stereotype.Component;import java.util.Date; import java.util.HashMap; import java.util.Map; /** *Jwt工具类 */ Component//加入Spring容器 public class JwtUtil {private String secret your_secret_key; // 强密码private long expiration 60 * 60 * 1000; // 1小时//这个方法用于生成 JWT。它接受用户名作为参数。public String generateToken(String username) {MapString, Object claims new HashMap();return createToken(claims, username);}//私有方法用于实际生成 JWTprivate String createToken(MapString, Object claims, String subject) {return Jwts.builder()//开始构建 JWT 的构建器.setClaims(claims)//设置 JWT 中的声明.setSubject(subject)//设置主题通常是用户名.setIssuedAt(new Date(System.currentTimeMillis()))//设置 JWT 的签发时间.setExpiration(new Date(System.currentTimeMillis() expiration))//设置 JWT 的过期时间.signWith(SignatureAlgorithm.HS256, secret)//使用指定的算法HS256和密钥对 JWT 进行签名.compact();//生成最终的 JWT 字符串}//用于验证给定的 JWT 是否有效。public Boolean validateToken(String token, String username) {final String extractedUsername extractUsername(token);//提取 JWT 中的用户名return (extractedUsername.equals(username) !isTokenExpired(token));//检查提取的用户名与提供的用户名是否匹配并且检查 JWT 是否未过期}//从 JWT 中提取用户名public String extractUsername(String token) {return extractAllClaims(token).getSubject();}//解析 JWT 并返回所有声明private Claims extractAllClaims(String token) {return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();}//使用密钥解析 JWT 获取其主体部分声明//检查 JWT 是否已过期private Boolean isTokenExpired(String token) {return extractAllClaims(token).getExpiration().before(new Date());} }五、JWT请求过滤器 创建JWT请求过滤器用于拦截请求并验证JWT package com.example.jwt.filter;import com.example.jwt.service.JwtUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; import org.springframework.stereotype.Component; import org.springframework.web.filter.OncePerRequestFilter;import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException;Component // 将该类标记为 Spring 组件以便自动扫描和管理 public class JwtRequestFilter extends OncePerRequestFilter {Autowired // 自动注入 JwtUtil 实例private JwtUtil jwtUtil;Autowired // 自动注入 UserDetailsService 实例private UserDetailsService userDetailsService;Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)throws ServletException, IOException {// 从请求中获取 Authorization 头部final String authorizationHeader request.getHeader(Authorization);String username null; // 初始化用户名String jwt null; // 初始化 JWT 令牌// 检查 Authorization 头部是否存在且以 Bearer 开头if (authorizationHeader ! null authorizationHeader.startsWith(Bearer )) {// 提取 JWT 令牌去掉 Bearer 前缀jwt authorizationHeader.substring(7);// 从 JWT 中提取用户名username jwtUtil.extractUsername(jwt);}// 如果用户名不为空且当前 SecurityContext 没有身份验证信息if (username ! null SecurityContextHolder.getContext().getAuthentication() null) {// 根据用户名加载用户详细信息UserDetails userDetails userDetailsService.loadUserByUsername(username);// 验证 JWT 是否有效if (jwtUtil.validateToken(jwt, userDetails.getUsername())) {// 创建身份验证令牌并设置用户的权限UsernamePasswordAuthenticationToken authenticationToken new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());// 设置请求的详细信息authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));// 将身份验证信息存入 SecurityContextSecurityContextHolder.getContext().setAuthentication(authenticationToken);}}// 继续过滤器链chain.doFilter(request, response);} }六、安全配置 配置Spring Security以保护API并使用JWT package com.example.jwt.config;import com.example.jwt.filter.JwtRequestFilter; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder;Configuration EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter {Autowiredprivate JwtRequestFilter jwtRequestFilter;Overrideprotected void configure(HttpSecurity http) throws Exception {http.csrf().disable().authorizeRequests().antMatchers(/auth/login).permitAll() // 公开登录接口.anyRequest().authenticated() // 其他接口需要认证.and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); // 无状态会话// 添加JWT过滤器http.addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class);}Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.inMemoryAuthentication().withUser(user).password(passwordEncoder().encode(password)).roles(USER); // 示例用户}Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}BeanOverridepublic AuthenticationManager authenticationManagerBean() throws Exception {return super.authenticationManagerBean();} }七、身份验证控制器 创建一个控制器来处理登录请求并返回JWT package com.example.jwt.controller;import com.example.jwt.model.User; import com.example.jwt.service.JwtUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.web.bind.annotation.*;RestController RequestMapping(/auth) public class AuthController {Autowiredprivate JwtUtil jwtUtil;Autowiredprivate AuthenticationManager authenticationManager;Autowiredprivate UserDetailsService userDetailsService;PostMapping(/login)public String login(RequestBody User user) {try {authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(user.getUsername(), user.getPassword()));} catch (Exception e) {throw new RuntimeException(Invalid credentials);}final UserDetails userDetails userDetailsService.loadUserByUsername(user.getUsername());return jwtUtil.generateToken(userDetails.getUsername());} }八、测试JWT 启动Spring Boot应用程序。使用Postman或其他工具测试登录接口。 请求示例 POST /auth/login Content-Type: application/json{username: user,password: password }响应示例 {token: eyJhbGciOiJIUzI1NiIsInR5c... }使用返回的token访问受保护的资源 GET /protected/resource Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5c...
http://www.w-s-a.com/news/209297/

相关文章:

  • 招聘网站建设工作总结湘潭seo
  • 台山网站设计哈尔滨网站建设外包公司
  • 常州城投建设招标网站网页设计入门教学视频
  • 石家庄教育平台网站建设wordpress 访问量统计
  • 为什么买的网站模版不好用ftp网站建设
  • 做网站办公照片crm系统视频
  • 网站建设 招标文件南昌做网络推广的
  • 增城电子商务网站建设浙江省住房和城乡建设部网站
  • 企业网站宽度给多少手机软件开发公司排名
  • 装修设计网站哪个平台最好免费自助建站工具
  • 网站建设规划结构网站服务费怎么做分录
  • 哪里有做网站的公司微商怎么开店步骤
  • 访问不了服务器的网站北京工业产品设计公司
  • 怎么棋牌网站建设口碑好的福州网站建设
  • 怎么样注册一个网站南通网站定制搭建
  • 网站免费正能量软件下载wordpress 多本小说
  • 临淄网站制作价格低长沙谷歌seo收费
  • 吴江公司网站建设电话免费的那种软件
  • 大淘客网站如何做seo网络广告设计公司
  • 厦门网络营销顾问湘潭网站seo
  • asp.net个人网站淮南 搭建一个企业展示网站
  • 备案关闭网站wordpress 替换
  • 台州建设网站制作wordpress乱码
  • 互联网时代 网站建设做交互设计的网站
  • 网站屏蔽中文浏览器湘潭做网站广告的公司
  • 好看的单页面网站模板免费下载手机网站经典案例
  • 优秀网站建设平台建筑模板工厂价格尺寸
  • 合肥微信网站建设旅游景区网站模板
  • 一个只做百合的网站wordpress文章和博客的区别
  • 编写网站策划方案网站哪里有