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

写作网站原码成都seo顾问

写作网站原码,成都seo顾问,wordpress模板 论坛,网站开发年度总结一、简述 JWT由三部分组成:Header、Payload(负载)、Signature(签名)。 Header部分记录使用的加密算法和Token类型。Payload部分可以放一些用户信息。如账号、姓名等非敏感信息。签名是将Header部分和Payload部分做加密签名,使用Header中指定的加密算法…

一、简述

JWT由三部分组成:Header、Payload(负载)、Signature(签名)。

  1. Header部分记录使用的加密算法和Token类型。
  2. Payload部分可以放一些用户信息。如账号、姓名等非敏感信息。
  3. 签名是将Header部分和Payload部分做加密签名,使用Header中指定的加密算法。

二、JWT工具类

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;/*** JWT生成、解析、校验工具类** @author neo* @since 2025-02-27*/
public class JWTUtil {// 加密密钥。在程序启动后初始化private String secret = "";private JWTUtil(){}public static JWTUtil instance(){return JWTUtilBuilder.instance;}/*** 设置加密密钥** @param secret 密钥* @author neo* @since 2025/3/25*/public void setSecret(String secret){this.secret = secret;}/*** 创建Token** @param parameterMap 参数表* @return 生成的Token* @author neo* @since 2025/3/25*/public String createToken(Map<String, String> parameterMap){Calendar calendar = Calendar.getInstance();// 设置三天后过期calendar.add(Calendar.DATE, 3);JWTCreator.Builder builder = JWT.create();// 设置headerMap<String, Object> headerMap = new HashMap<>();headerMap.put("alg", "HS256");headerMap.put("typ", "JWT");builder.withHeader(headerMap);// 填充负载for (Map.Entry<String, String> entry : parameterMap.entrySet()) {builder.withClaim(entry.getKey(), entry.getValue());}// 创建tokenString token = builder.withExpiresAt(calendar.getTime()).sign(Algorithm.HMAC256(secret));return token;}/*** 校验Token是否有效** @param token 令牌* @return 校验结果*/public DecodedJWT verifyJWT(String token){JWTVerifier verifier = JWT.require(Algorithm.HMAC256(secret)).build();return verifier.verify(token);}/*** 解析Token获取负载中的参数** @param token 令牌* @return 参数*/public Map<String, String> decodeToken(String token){DecodedJWT decodedJWT = verifyJWT(token);// 提取参数Map<String, String> parameterMap = new HashMap<>();Map<String, Claim> claimMap = decodedJWT.getClaims();claimMap.forEach((k, v)->{parameterMap.put(k, v.asString());});return parameterMap;}private static final class JWTUtilBuilder {private static JWTUtil instance = new JWTUtil();}
}

JWTUtil 工具类实现了JWT的生成,校验、参数解析功能。使用的密钥secret可以在程序启动时从配置文件中读取,然后通过setSecret方法保存到内存。

三、提供登录接口

@RestController
@RequestMapping("/v1/login")
@Api(tags = "用户登录服务")
public class LoginController extends BaseController {private static final Logger LOGGER = LogManager.getLogger(LoginController.class);@Resourceprivate LoginService loginService;/*** 用户登录** @param loginUser 用户信息* @return 生成的token*/@PostMapping("/login-in")@ApiOperation(value = "用户登录")public ResultModel<String> login(@RequestBody UserLogin loginUser){return loginService.login(loginUser);}}

前端在用户登录时调用后台的登录接口,传入用户名,密码等信息(封装在UserLogin中)。后端服务调用JWTUtil的接口生成Token信息并返回给前端。前端可以将Token信息保存在本地存储或者session中。

用户登录后,前端后续调用其它业务接口时将Token放到http的请求头中传递到后台,后台拦截器提取Token数据做权限认证。

四、通过拦截器拦截http请求并认证

import com.elon.base.util.JWTUtil;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** 拦截rest接口请求,做用户合法性认证.** @author neo* @since 2025-02-28*/
public class JWTInterceptor implements HandlerInterceptor {private static final Logger LOGGER = LogManager.getLogger(JWTInterceptor.class);@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 提起请求头中的jwt信息String jwtToken = request.getHeader("jwt-token");try {JWTUtil.instance().verifyJWT(jwtToken);response.setHeader("Access-Control-Allow-Origin", "*");return true;} catch (Exception e){LOGGER.error("Verify token fail.", e);response.setContentType("application/json;charset=UTF-8");response.getWriter().println("Token is valid");// 设置为没有权限,前端拿到响应码需跳转到登录页面response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);return false;}}
}

认证不通过的请求返回401。

五、添加拦截器及拦截规则

import com.neo.lesson.manage.JWTInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;/*** 注册JWT Token拦截器** @author neo* @since 2025-02-28*/
@Configuration
public class JWTConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry){registry.addInterceptor(new JWTInterceptor()).addPathPatterns("/v1/lesson/**", "/v1/student/**").excludePathPatterns("/v1/login/**");}
}

仅有用户登录的接口不拦截,其它业务接口均需要拦截。

六、扩展考虑

  1. JWT在生成时设置了过期时间,但在实际项目中可能会根据业务需要设置不同的过期时间。例如:如果用户登录后30分钟没有做任何操作,那么系统将自动登出。这种情况可以考虑将token数据放到redis中存储,利用redis的失效机制。

  2. 系统不仅需要认证用户身份合法性,还需要根据用户的不同角色对接口做鉴权。此时需要在拦截http请求后获取用户的权限信息,结合当前请求的接口地址做校验。

http://www.dtcms.com/wzjs/437082.html

相关文章:

  • 个人可以做医疗信息网站吗搜索引擎网站优化推广
  • 做网站较好的框架代引流推广公司
  • 推荐手机网站建设搜索引擎关键词seo优化公司
  • 虚拟空间是什么意思西安官网seo公司
  • 开发一个电商app软件多少钱网站推广优化平台
  • 网站建设的功能定位企业文化理念
  • 网站建设和管理颁奖百度电脑版入口
  • 如何登录百度站长平台全球中文网站排名
  • wap蓝天建站全球搜索引擎
  • 网站建设工作情况总结营销策划方案模板范文
  • 外贸网站建设 联雅一键优化是什么意思
  • 西湖区住房和城市建设局网站网站黄页推广软件
  • 网站平台做期货win10优化大师怎么样
  • 泗阳网站建设百度代理查询
  • 网站开发建设项目服务清单合肥seo整站优化
  • 辽宁省工程建设信息网官网知乎推广优化
  • 农业网站怎么做百度推广海外推广是做什么的
  • wordpress 社交图标百度seo关键词优化排行
  • 博客网站的建设流程精准营销的典型案例
  • 生物网站建设临沂网站建设
  • 互联网营销培训班 考证关键词优化难度查询
  • 美食网站建设网络营销网站分析
  • 政府网站集中建设seo诊断
  • 网站制作价格阿里云模板建站
  • 想制作一个网站要多少钱seo论坛站长交流
  • 驻马店阿里巴巴做网站培训心得模板
  • 大理网站制作网络竞价推广开户
  • 网站建设文案怎么设计天津seo优化排名
  • 专做定制网站建设今日实时热点新闻事件
  • jsp网站项目网站链接提交收录