千家信息网

SpringBoot2如何整合JWT框架解决Token跨域验证问题

发表于:2024-10-22 作者:千家信息网编辑
千家信息网最后更新 2024年10月22日,小编给大家分享一下SpringBoot2如何整合JWT框架解决Token跨域验证问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解
千家信息网最后更新 2024年10月22日SpringBoot2如何整合JWT框架解决Token跨域验证问题

小编给大家分享一下SpringBoot2如何整合JWT框架解决Token跨域验证问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

一、传统Session认证

1、认证过程

1、用户向服务器发送用户名和密码。2、服务器验证后在当前对话(session)保存相关数据。3、服务器向返回sessionId,写入客户端 Cookie。4、客户端每次请求,需要通过 Cookie,将 sessionId 回传服务器。5、服务器收到 sessionId,验证客户端。

2、存在问题

1、session保存在服务端,客户端访问高并发时,服务端压力大。2、扩展性差,服务器集群,就需要 session 数据共享。

二、JWT简介

JWT(全称:JSON Web Token),在基于HTTP通信过程中,进行身份认证。

1、认证流程

1、客户端通过用户名和密码登录服务器;2、服务端对客户端身份进行验证;3、服务器认证以后,生成一个 JSON 对象,发回客户端;4、客户端与服务端通信的时候,都要发回这个 JSON 对象;5、服务端解析该JSON对象,获取用户身份;6、服务端可以不必存储该JSON(Token)对象,身份信息都可以解析出来。

2、JWT结构说明

抓一只鲜活的Token过来。

{    "msg": "验证成功",    "code": 200,    "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.              eyJzdWIiOiJhZG1pbiIsImlhdCI6iZEIj3fQ.              uEJSJagJf1j7A55Wwr1bGsB5YQoAyz5rbFtF"}

上面的Token被手动格式化了,实际上是用"."分隔的一个完整的长字符串。

JWT结构

1、头部(header) 声明类型以及加密算法;2、负载(payload) 携带一些用户身份信息;3、签名(signature) 签名信息。

3、JWT使用方式

通常推荐的做法是客户端在 HTTP 请求的头信息Authorization字段里面。

Authorization: Bearer 

服务端获取JWT方式

String token = request.getHeader("token");

三、与SpringBoot2整合

1、核心依赖文件

    io.jsonwebtoken    jjwt    0.7.0

2、配置文件

server:  port: 7009spring:  application:    name: ware-jwt-tokenconfig:  jwt:    # 加密密钥    secret: iwqjhda8232bjgh532[cicada-smile]    # token有效时长    expire: 3600    # header 名称    header: token

3、JWT配置代码块

@ConfigurationProperties(prefix = "config.jwt")@Componentpublic class JwtConfig {    /*     * 根据身份ID标识,生成Token     */    public String getToken (String identityId){        Date nowDate = new Date();        //过期时间        Date expireDate = new Date(nowDate.getTime() + expire * 1000);        return Jwts.builder()                .setHeaderParam("typ", "JWT")                .setSubject(identityId)                .setIssuedAt(nowDate)                .setExpiration(expireDate)                .signWith(SignatureAlgorithm.HS512, secret)                .compact();    }    /*     * 获取 Token 中注册信息     */    public Claims getTokenClaim (String token) {        try {            return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();        }catch (Exception e){            e.printStackTrace();            return null;        }    }    /*     * Token 是否过期验证     */    public boolean isTokenExpired (Date expirationTime) {        return expirationTime.before(new Date());    }    private String secret;    private long expire;    private String header;    // 省略 GET 和 SET}

四、Token拦截案例

1、配置Token拦截器

@Componentpublic class TokenInterceptor extends HandlerInterceptorAdapter {    @Resource    private JwtConfig jwtConfig ;    @Override    public boolean preHandle(HttpServletRequest request,                             HttpServletResponse response,                             Object handler) throws Exception {        // 地址过滤        String uri = request.getRequestURI() ;        if (uri.contains("/login")){            return true ;        }        // Token 验证        String token = request.getHeader(jwtConfig.getHeader());        if(StringUtils.isEmpty(token)){            token = request.getParameter(jwtConfig.getHeader());        }        if(StringUtils.isEmpty(token)){            throw new Exception(jwtConfig.getHeader()+ "不能为空");        }        Claims claims = jwtConfig.getTokenClaim(token);        if(claims == null || jwtConfig.isTokenExpired(claims.getExpiration())){            throw new Exception(jwtConfig.getHeader() + "失效,请重新登录");        }        //设置 identityId 用户身份ID        request.setAttribute("identityId", claims.getSubject());        return true;    }}

2、拦截器注册

@Configurationpublic class WebConfig implements WebMvcConfigurer {    @Resource    private TokenInterceptor tokenInterceptor ;    public void addInterceptors(InterceptorRegistry registry) {        registry.addInterceptor(tokenInterceptor).addPathPatterns("/**");    }}

3、测试接口代码

@RestControllerpublic class TokenController {    @Resource    private JwtConfig jwtConfig ;    // 拦截器直接放行,返回Token    @PostMapping("/login")    public Map login (@RequestParam("userName") String userName,                                     @RequestParam("passWord") String passWord){        Map result = new HashMap<>() ;        // 省略数据源校验        String token = jwtConfig.getToken(userName+passWord) ;        if (!StringUtils.isEmpty(token)) {            result.put("token",token) ;        }        result.put("userName",userName) ;        return result ;    }    // 需要 Token 验证的接口    @PostMapping("/info")    public String info (){        return "info" ;    }}

以上是"SpringBoot2如何整合JWT框架解决Token跨域验证问题"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

服务 验证 客户 客户端 服务器 身份 用户 信息 认证 对象 问题 整合 数据 篇文章 拦截器 配置 框架 代码 内容 密码 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 工控机和服务器的区别 南京尚运网络技术有限公司 为什么企业不用数据库三范式 多媒体与网络技术专业怎么样 网络技术发展前沿专业导论心得 国家网络安全年会 宁波江北附近戴尔机架式服务器 手里有软件开发团队怎么创业 怎么设置数据库单选框控件 网络安全工程专业在哪个校区 医用气体报警系统服务器 软件开发实习生工作内容 java语言使用的数据库 汽车因智能网络技术 网站数据库怎么导出来 逐梦网络技术公司 客户端 服务器 代码 金融机构网络安全责任书 课题申报系统数据库设计 深圳纺织软件开发 济南中科软件开发公司吗 山东神灯互联网科技有限公司 csf数据库 福建工程审批管控软件开发平台 山西现代化软件开发联系方式 应用存储和其他服务器的区别 软件开发方向毕业论文 邵阳市网络安全和信息化 无人便利柜零售软件开发 软件开发工程师蛋糕
0