• Jwt 介绍


    目录

    一,jwt出现的原因及工作原理

    二,jwt工具类介绍,三种场景 

    JwtFilter:

       Http.js:


    一,jwt出现的原因及工作原理

    1. JWT是什么
       JSON Web Token (JWT),它是目前最流行的跨域身份验证解决方案
    2. 为什么使用JWT
       JWT的精髓在于:“去中心化”,数据是保存在客户端的。

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

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

    二,jwt工具类介绍,三种场景 

    JwtFilter:

    1. package com.zking.vue.util;
    2. import java.io.IOException;
    3. import java.util.regex.Matcher;
    4. import java.util.regex.Pattern;
    5. import javax.servlet.Filter;
    6. import javax.servlet.FilterChain;
    7. import javax.servlet.FilterConfig;
    8. import javax.servlet.ServletException;
    9. import javax.servlet.ServletRequest;
    10. import javax.servlet.ServletResponse;
    11. import javax.servlet.http.HttpServletRequest;
    12. import javax.servlet.http.HttpServletResponse;
    13. import io.jsonwebtoken.Claims;
    14. /**
    15. * * JWT验证过滤器,配置顺序 :CorsFilte-->JwtFilter-->struts2中央控制器
    16. *
    17. * @author Administrator
    18. *
    19. */
    20. public class JwtFilter implements Filter {
    21. // 排除的URL,一般为登陆的URL(请改成自己登陆的URL)
    22. private static String EXCLUDE = "^/vue/userAction_login\\.action?.*$";
    23. private static Pattern PATTERN = Pattern.compile(EXCLUDE);
    24. private boolean OFF = true;// true关闭jwt令牌验证功能
    25. @Override
    26. public void init(FilterConfig filterConfig) throws ServletException {
    27. }
    28. @Override
    29. public void destroy() {
    30. }
    31. @Override
    32. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    33. throws IOException, ServletException {
    34. HttpServletRequest req = (HttpServletRequest) request;
    35. HttpServletResponse resp = (HttpServletResponse) response;
    36. String path = req.getServletPath();
    37. if (OFF || isExcludeUrl(path)) {// 登陆直接放行
    38. chain.doFilter(request, response);
    39. return;
    40. }
    41. // 从客户端请求头中获得令牌并验证
    42. String jwt = req.getHeader(JwtUtils.JWT_HEADER_KEY);
    43. Claims claims = this.validateJwtToken(jwt);
    44. if (null == claims) {
    45. // resp.setCharacterEncoding("UTF-8");
    46. resp.sendError(403, "JWT令牌已过期或已失效");
    47. return;
    48. } else {
    49. String newJwt = JwtUtils.copyJwt(jwt, JwtUtils.JWT_WEB_TTL);
    50. resp.setHeader(JwtUtils.JWT_HEADER_KEY, newJwt);
    51. chain.doFilter(request, response);
    52. }
    53. }
    54. /**
    55. * 验证jwt令牌,验证通过返回声明(包括公有和私有),返回null则表示验证失败
    56. */
    57. private Claims validateJwtToken(String jwt) {
    58. Claims claims = null;
    59. try {
    60. if (null != jwt) {
    61. claims = JwtUtils.parseJwt(jwt);
    62. }
    63. } catch (Exception e) {
    64. e.printStackTrace();
    65. }
    66. return claims;
    67. }
    68. /**
    69. * 是否为排除的URL
    70. *
    71. * @param path
    72. * @return
    73. */
    74. private boolean isExcludeUrl(String path) {
    75. Matcher matcher = PATTERN.matcher(path);
    76. return matcher.matches();
    77. }
    78. // public static void main(String[] args) {
    79. // String path = "/sys/userAction_doLogin.action?username=zs&password=123";
    80. // Matcher matcher = PATTERN.matcher(path);
    81. // boolean b = matcher.matches();
    82. // System.out.println(b);
    83. // }
    84. }

       Http.js:

    1. /**
    2. * vue项目对axios的全局配置
    3. */
    4. import axios from 'axios'
    5. import qs from 'qs'
    6. //引入action模块,并添加至axios的类属性urls上
    7. import action from '@/api/action'
    8. axios.urls = action
    9. // axios默认配置
    10. axios.defaults.timeout = 10000; // 超时时间
    11. // axios.defaults.baseURL = 'http://localhost:8080/j2ee15'; // 默认地址
    12. axios.defaults.baseURL = action.SERVER;
    13. //整理数据
    14. // 只适用于 POST,PUT,PATCH,transformRequest` 允许在向服务器发送前,修改请求数据
    15. axios.defaults.transformRequest = function(data) {
    16. data = qs.stringify(data);
    17. return data;
    18. };
    19. // 请求拦截器
    20. axios.interceptors.request.use(function(config) {
    21. var jwt = window.vm.$store.getters.getJwt;
    22. config.headers['jwt'] = jwt;
    23. return config;
    24. }, function(error) {
    25. return Promise.reject(error);
    26. });
    27. // 响应拦截器
    28. axios.interceptors.response.use(function(response) {
    29. debugger;
    30. var jwt = response.headers['jwt'];
    31. if(jwt){
    32. window.vm.$store.commit('setJwt',{jwt:jwt});
    33. }
    34. return response;
    35. }, function(error) {
    36. return Promise.reject(error);
    37. });
    38. export default axios;

    mutations.js:

    1. export default {
    2. setResName:(state,payload)=>{
    3. // state对象就对应了state.js中的对象
    4. // payload载荷 对应的 传递的 json对象参数{name:zs,age:24}
    5. state.resName=payload.resName;
    6. },
    7. setJwt:(state,payload)=>{
    8. state.jwt=payload.jwt;
    9. }
    10. }

    state.js:

    1. export default {
    2. resName:'阿猪餐馆',
    3. jwt:''
    4. }

    getters.js:

    1. export default {
    2. getResName:(state)=>{
    3. return state.resName;
    4. },
    5. getJwt:(state)=>{
    6. return state.jwt;
    7. }
    8. }

    main.js:

    1. // The Vue build version to load with the `import` command
    2. // (runtime-only or standalone) has been set in webpack.base.conf with an alias.
    3. import Vue from 'vue'
    4. //开发环境下才会引入mockjs
    5. //process.env.MOCK为false,那么require('@/mock')就不执行;
    6. // process.env.MOCK在生产环境下为false
    7. // process.env.MOCK && require('@/mock')
    8. import ElementUI from 'element-ui' // 新添加 1
    9. import 'element-ui/lib/theme-chalk/index.css' // 新添加 2 ,避免后期打包样式
    10. import App from './App'
    11. import router from './router'
    12. import axios from '@/api/http' //vue项目对axios的全局配置
    13. // import axios from 'axios'
    14. import VueAxios from 'vue-axios'
    15. import store from './store'
    16. Vue.use(ElementUI);//新添加 3
    17. Vue.use(VueAxios,axios);
    18. Vue.config.productionTip = false
    19. /* eslint-disable no-new */
    20. window.vm = new Vue({
    21. el: '#app',
    22. router,
    23. store,
    24. data(){
    25. return {
    26. //在vue根实例中定一个变量,这个变量就是vue实例,它总线
    27. //props this.$emit
    28. Bus:new Vue({})
    29. }
    30. },
    31. components: { App },
    32. template: ''
    33. })

  • 相关阅读:
    中远麒麟堡垒机tokensSQL注入漏洞
    记一次性能飙升的Mysql CRUD数据表迁移到Clickhouse表的过程
    利用Docker安装Protostar
    【C++】经典二叉树面试题
    机器学习03
    Tronapi-波场接口-源码无加密-可二开--附接口文档-基于ThinkPHP5封装-作者详细指导-2022年7月1日08:43:06
    【Hack The Box】windows练习-- acute
    奇迹mu开服教程:开服服务端的架设及服务器推荐需要那些东西
    Linux教程 | 什么是Makefile?如何编写一个Makefile?
    Electron自动更新
  • 原文地址:https://blog.csdn.net/m0_62327548/article/details/126932120