JSON Web令牌(JWT)详解

本文详细介绍了JWT的工作原理、使用原因及其在前端与后端的应用,包括JWT的生成、验证、过期处理等关键步骤。通过具体示例展示了JWT在Vue.js项目中的配置与使用,以及JWT如何解决无需登录即可访问的问题。
摘要由CSDN通过智能技术生成

前言

今天要分享的知识是JWT

码字不易,转载请说明!!!


目录

一、JWT出现的原因及工作原理

JWT是什么

为什么使用JWT

JWT的工作原理  

JWT组成

传统开发对资源的访问限制利用session完成图解 

​JWT所解决的问题及机制

JWT解决不需要登录就能直接访问的问题 

web.xml:解决JWT问题的过滤器

JwtFilter.java:开启jwt令牌验证功能 

UserAction .java:将jwt令牌塞入响应头 

未登录就不能显示内容

并且报出403错误

解决方案 

①在前台获取JWT令牌:src/api/http.js

②main.js内进行赋值:src/main.js  

③将JWT令牌这个值放到vuex内:src/store/Mutations.js 

④定义变量:src/store/State.js

⑤请求拦截器:src/api/http.js 

⑥定义获取的方法:src/store/getters.js 

⑦总结

二、JWT工具类介绍,三种场景

JWT的数据结构

JwtUtils.java

三种场景

①如何通过jwt的工具类去生成令牌以及解析令牌

​②令牌过期的场景

③延续令牌的存活时间


一、JWT出现的原因及工作原理

JWT是什么

JSON Web Token(JWT)是目前最流行的跨域身份验证解决方法

为什么使用JWT

 JWT的精髓在于:“去中心化”,数据是保存在客户端的

JWT的工作原理  

  1. 是在服务器身份验证之后,将生成一个JSON对象并将其发送回用户,示例如下:
      {"UserName": "Chongchong","Role": "Admin","Expire": "2018-08-08 20:15:56"}

   2. 之后,当用户与服务器通信时,客户在请求中发回JSON对象
    
   3. 为了防止用户篡改数据,服务器将在生成对象时添加签名,并对发回的数据进行验证

JWT组成

 一个JWT实际上就是一个字符串,它由三部分组成:

   头部(Header)、载荷(Payload)与签名(signature)

传统开发对资源的访问限制利用session完成图解 

JWT所解决的问题及机制

JWT解决不需要登录就能直接访问的问题 

web.xml:解决JWT问题的过滤器

<!-- 解决jwt问题的过滤器 -->
    <filter>
        <filter-name>jwtFilter</filter-name>
        <filter-class>com.zking.vue.util.JwtFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>jwtFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

JwtFilter.java:开启jwt令牌验证功能 

package com.zking.vue.util;

import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import io.jsonwebtoken.Claims;

/**
 * * JWT验证过滤器,配置顺序 :CorsFilte-->JwtFilter-->struts2中央控制器
 * 
 * @author Administrator
 *
 */
public class JwtFilter implements Filter {

    // 排除的URL,一般为登陆的URL(请改成自己登陆的URL)
    private static String EXCLUDE = "^/vue/userAction_login\\.action?.*$";

    private static Pattern PATTERN = Pattern.compile(EXCLUDE);

    private boolean OFF = false;// true关闭jwt令牌验证功能

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void destroy() {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;
        String path = req.getServletPath();
        if (OFF || isExcludeUrl(path)) {// 登陆直接放行
            chain.doFilter(request, response);
            return;
        }

        // 从客户端请求头中获得令牌并验证
        String jwt = req.getHeader(JwtUtils.JWT_HEADER_KEY);
        Claims claims = this.validateJwtToken(jwt);
        if (null == claims) {
            // resp.setCharacterEncoding("UTF-8");
            resp.sendError(403, "JWT令牌已过期或已失效");
            return;
        } else {
            String newJwt = JwtUtils.copyJwt(jwt, JwtUtils.JWT_WEB_TTL);
            resp.setHeader(JwtUtils.JWT_HEADER_KEY, newJwt);
            chain.doFilter(request, response);
        }
    }

    /**
     * 验证jwt令牌,验证通过返回声明(包括公有和私有),返回null则表示验证失败
     */
    private Claims validateJwtToken(String jwt) {
        Claims claims = null;
        try {
            if (null != jwt) {
                claims = JwtUtils.parseJwt(jwt);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return claims;
    }

    /**
     * 是否为排除的URL
     * 
     * @param path
     * @return
     */
    private boolean isExcludeUrl(String path) {
        Matcher matcher = PATTERN.matcher(path);
        return matcher.matches();
    }

    // public static void main(String[] args) {
    // String path = "/sys/userAction_doLogin.action?username=zs&password=123";
    // Matcher matcher = PATTERN.matcher(path);
    // boolean b = matcher.matches();
    // System.out.println(b);
    // }

}

UserAction .java:将jwt令牌塞入响应头 

package com.zking.vue.web;

import java.util.HashMap;
import java.util.Map;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.opensymphony.xwork2.ModelDriven;
import com.zking.base.web.BaseAction;
import com.zking.vue.biz.UserBiz;
import com.zking.vue.entity.User;
import com.zking.vue.util.JsonData;
import com.zking.vue.util.JwtUtils;
import com.zking.vue.util.PageBean;
import com.zking.vue.util.ResponseUtil;
import com.zking.vue.util.StringUtils;

public clas
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值