最全jwt ——面试概率非常高,征服Java面试官

最后

按照上面的过程,4个月的时间刚刚好。当然Java的体系是很庞大的,还有很多更高级的技能需要掌握,但不要着急,这些完全可以放到以后工作中边用别学。

学习编程就是一个由混沌到有序的过程,所以你在学习过程中,如果一时碰到理解不了的知识点,大可不必沮丧,更不要气馁,这都是正常的不能再正常的事情了,不过是“人同此心,心同此理”的暂时而已。

道路是曲折的,前途是光明的!”

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

在前后台分离这种操作下,session就不起作用了,不是这个服务器了,

session是保存在后端服务器,前台拿不到后台绑定的session服务器的id,

所有说session这种机制就被淘汰掉了,出现了JWT,也就解决了session这种问题

4、后端使用JWT

配置解决jwt问题的过滤器web.xml:

<web-app xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”

xmlns=“http://java.sun.com/xml/ns/javaee”

xsi:schemaLocation=“http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_1.xsd”

id=“WebApp_ID” version=“3.1”>

Archetype Created Web Application

contextConfigLocation

classpath:spring-context.xml

org.springframework.web.context.ContextLoaderListener

corsFilter

com.zking.vue.util.CorsFilter

corsFilter

/*

**

jwtFilter

com.zking.vue.util.JwtFilter

jwtFilter

/*

**

struts2

org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter

struts2

/*

encodingFilter

org.springframework.web.filter.CharacterEncodingFilter

true

encoding

UTF-8

encodingFilter

/*

JwtFilter.java:

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:

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 class UserAction extends BaseAction implements ModelDriven{

private UserBiz userBiz;

private User user = new User();

public UserBiz getUserBiz() {

return userBiz;

}

public void setUserBiz(UserBiz userBiz) {

this.userBiz = userBiz;

}

public String login() {

ObjectMapper om = new ObjectMapper();

JsonData jsonData = null;

try {

if(StringUtils.isBlank(user.getUname()) || StringUtils.isBlank(user.getPwd())) {

jsonData = new JsonData(0, “用户或者密码为空”, user);

}else {

User u = this.userBiz.login(user);

**Map<String, Object> claims = new HashMap<String, Object>();

claims.put(“uname”,user.getUname());

claims.put(“pwd”, user.getPwd());

String jwt = JwtUtils.createJwt(claims, JwtUtils.JWT_WEB_TTL);

response.setHeader(JwtUtils.JWT_HEADER_KEY, jwt);

jsonData = new JsonData(1, “登录成功”, u);**

}

} catch (Exception e) {

e.printStackTrace();

jsonData = new JsonData(0, “用户或者密码错误”, user);

}finally {

try {

ResponseUtil.write(response, om.writeValueAsString(jsonData));

} catch (Exception e) {

e.printStackTrace();

}

}

return null;

}

public String getAsyncData() {

ObjectMapper om = new ObjectMapper();

try {

Thread.sleep(6000);

ResponseUtil.write(response, om.writeValueAsString(“http://www.javaxl.com”));

} catch (Exception e) {

e.printStackTrace();

}

return null;

}

@Override

public User getModel() {

return user;

}

}

未登录就不能显示内容:

二、JWT工作原理代码论证及效果演示


限制你的访问,如果强行访问会产生403:

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

// 响应拦截器

axios.interceptors.response.use(function(response) {

// debugger;

var jwt = response.headers[‘jwt’];

if(jwt){

// 由于这获取不到this,window.vm代表this,代表跟实例,去main.js内进行赋值

window.vm.$store.commit(‘setJwt’,{jwt:jwt});

}

return response;

}, function(error) {

return Promise.reject(error);

});

2、main.js内进行赋值src/main.js

// The Vue build version to load with the `import` command

// (runtime-only or standalone) has been set in webpack.base.conf with an alias.

import Vue from ‘vue’

// 开发环境下才会引入mockjs

//开发环境:true && require(‘@/mock’)会执行后面代码,也就是说mock.js会被导入到当前环境

// 生产环境:false && require(‘@/mock’)不会执行后面代码,也就是说mock.js是不会引入到当前环境中

// process.env.MOCK && require(‘@/mock’)

import ‘element-ui/lib/theme-chalk/index.css’

import App from ‘./App’

import router from ‘./router’

import ElementUI from ‘element-ui’

import axios from ‘@/api/http’ /* #vue项目对axios的全局配置 */

import VueAxios from ‘vue-axios’

import store from ‘./store’

Vue.use(ElementUI)

Vue.use(VueAxios,axios)

Vue.config.productionTip = false

/* eslint-disable no-new */

window.vm = new Vue({

el: ‘#app’,

data(){

return{

// 定义主线

Bus:new Vue({

})

}

},

router,

store,

components: { App },

template: ‘’

})

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

export default{

setResturantName: (state, payload) => {

state.resturantName = payload.resturantName;

},

**setJwt: (state, payload) => {

state.jwt = payload.jwt;

},**

doAjax:(state, payload) => {

// 需求:想在当前的文件中与后台服务器做数据交互

let _this=payload._this;

let url = _this.axios.urls.SYSTEM_MENU_TREE;

// 箭头函数解决了this指针污染问题

_this.axios.post(url, {}).then((resp) => {

console.log(resp);

}).catch(function(error) {

console.log(error);

});

}

}

4、定义变量:src/store/State.js

export default{

resturantName:‘飞歌餐馆’,

jwt:‘’

}

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

// 请求拦截器

axios.interceptors.request.use(function(config) {

var jwt = window.vm.$store.getters.getJwt;

config.headers[‘jwt’] = jwt;

return config;

}, function(error) {

return Promise.reject(error);

});

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

export default{

getResturantName:(state)=>{

return state.resturantName;

},

getJwt:(state)=>{

return state.jwt;

}

}

请求中得到JWT令牌:

7、session的安全性高还是JWT安全性高

使用session的用户的信息是存储到服务器,没有储存到客户端,登录之后重新打开其他的页面也可以进行访问

而JWT是存储到客户端的,每次请求会得到一个令牌,即使登录过,打开其他页面也是不允许访问的,重新打开一个页面拿不到上一次请求的令牌,这就是JWT的安全性比session高的多

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


1、JWT的数据结构:

Jwt头:头部信息,一个字符串

有效载荷:用户信息

《MySql面试专题》

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

《MySql性能优化的21个最佳实践》

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

《MySQL高级知识笔记》

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

文中展示的资料包括:**《MySql思维导图》《MySql核心笔记》《MySql调优笔记》《MySql面试专题》《MySql性能优化的21个最佳实践》《MySq高级知识笔记》**如下图

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

关注我,点赞本文给更多有需要的人

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

575066253)]

[外链图片转存中…(img-b13B97rl-1715575066253)]

《MySQL高级知识笔记》

[外链图片转存中…(img-7JI1Lm5U-1715575066254)]

[外链图片转存中…(img-W0hi7eOY-1715575066254)]

[外链图片转存中…(img-BdqoSyeU-1715575066254)]

[外链图片转存中…(img-cobQZSO4-1715575066255)]

[外链图片转存中…(img-bOnwHJe5-1715575066255)]

[外链图片转存中…(img-gtS66eXn-1715575066256)]

[外链图片转存中…(img-2ygXwMcv-1715575066256)]

[外链图片转存中…(img-aQTn4RaN-1715575066256)]

[外链图片转存中…(img-5TZnmdvK-1715575066256)]

[外链图片转存中…(img-XKO3qvZ6-1715575066257)]

文中展示的资料包括:**《MySql思维导图》《MySql核心笔记》《MySql调优笔记》《MySql面试专题》《MySql性能优化的21个最佳实践》《MySq高级知识笔记》**如下图

[外链图片转存中…(img-JCBcFWRV-1715575066257)]

关注我,点赞本文给更多有需要的人

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 27
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值