SpringBoot+Vue+JWT的前后端分離登錄認(rèn)證詳細(xì)步驟
前后端分離的概念在現(xiàn)在很火,最近也學(xué)習(xí)了一下前后端分離的登錄認(rèn)證。
創(chuàng)建后端springboot工程
這個(gè)很簡單了,按照idea的一步一步創(chuàng)建就行
文件目錄結(jié)構(gòu):

pom文件依賴導(dǎo)入。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.16</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
</dependencies>
創(chuàng)建實(shí)體類:User
//username,password,token三個(gè)字段
private String username;
private String password;
private String token;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
創(chuàng)建JWToken
public class JwtToken {
private static long time = 1000*5;
private static String signature = "admin";
//創(chuàng)建token的方法
public static String createToken(){
JwtBuilder jwtBuilder = Jwts.builder();
String jwtToken = jwtBuilder
//header
.setHeaderParam("typ","JWT")
.setHeaderParam("alg","HS256")
//payload
.claim("username","tom")
.claim("role","admin")
.setSubject("admin-test")
.setExpiration(new Date(System.currentTimeMillis()+time))
.setId(UUID.randomUUID().toString())
//signature
.signWith(SignatureAlgorithm.HS256,signature)
.compact();
return jwtToken;
}
//校驗(yàn)token,布爾類型
public static boolean checkToken(String token){
if (token ==null){
return false;
}
try {
Jws<Claims> claimsJws = Jwts.parser().setSigningKey(signature).parseClaimsJws(token);
}catch (Exception e){
return false;
}
return true;
}
}
創(chuàng)建控制器UserController
@RestController
public class UserController {
private final String USERNAME = "admin";
private final String PASSWORD = "123123";
//login方法
@GetMapping("/login")
public User login(User user){
if(USERNAME.equals(user.getUsername()) && PASSWORD.equals(user.getPassword())){
//添加token
user.setToken(JwtToken.createToken());
return user;
}
return null;
}
//校驗(yàn)token
@GetMapping("/checkToken")
//接收前端請求過來的header中的token,然后去jwtoken校驗(yàn)方法里校驗(yàn)這個(gè)token
public Boolean checkToken(HttpServletRequest request){
String token = request.getHeader("token");
return JwtToken.checkToken(token);
}
}
不要忘了前后端分離中的跨域問題, 我們在后端進(jìn)行跨域問題的解決。
@Configuration
public class CrosConfiguration implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOriginPatterns("*")
.allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS")
.allowCredentials(true)
.maxAge(3600)
.allowedHeaders("*");
}
}
前端創(chuàng)建Vue項(xiàng)目
Login頁面:
<script>
export default {
name: "Login",
data(){
return{
ruleForm: {
username: 'admin',
password: '123123'
},
rules: {
username: [{required: true, message: '請輸入用戶名', trigger: 'blur'}],
password: [{required: true, message: '請輸入密碼', trigger: 'blur'}]
}
}
},
methods: {
handleSubmit(){
this.$refs.ruleForm.validate((valid) => {
if(valid){
let _this = this
axios.get('http://localhost:8080/login',{params:_this.ruleForm}).then(function (response) {
if(response.data!=null){
//將token信息保存在本地客戶端
localStorage.setItem('access-admin',JSON.stringify(response.data))
_this.$router.replace({path:'/'})
}
})
}else{
console.log('error submit!');
return false;
}
})
}
}
};
</script>
home頁面
export default {
data(){
return {
admin: ''
}
},
created() {
//admin的信息從保存在客戶端中的信息中獲取
this.admin = JSON.parse(window.localStorage.getItem('access-admin'))
}
}
</script>
index.js路由
router.beforeEach((to, from, next) => {
if (to.path.startsWith('/login')) {
//取出token信息
window.localStorage.removeItem('access-admin')
next()
} else {
//獲取token的信息。
let admin = JSON.parse(window.localStorage.getItem('access-admin'))
if (!admin) {
next({path: '/login'})
} else {
//校驗(yàn)token合法性
axios({
url:'http://localhost:8080/checkToken',
method:'get',
headers:{
token:admin.token
}
}).then((response) => {
console.log(response.data)
if(!response.data){
console.log('校驗(yàn)失敗')
next({path: '/error'})
}
})
next()
}
}
}

到此這篇關(guān)于SpringBoot+Vue+JWT的前后端分離登錄認(rèn)證的文章就介紹到這了,更多相關(guān)SpringBoot登錄認(rèn)證內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot集成Spring Security用JWT令牌實(shí)現(xiàn)登錄和鑒權(quán)的方法
- spring boot如何基于JWT實(shí)現(xiàn)單點(diǎn)登錄詳解
- SpringBoot使用JWT實(shí)現(xiàn)登錄驗(yàn)證的方法示例
- springboot+jwt+微信小程序授權(quán)登錄獲取token的方法實(shí)例
- SpringBoot JWT實(shí)現(xiàn)token登錄刷新功能
- SpringBoot結(jié)合JWT實(shí)現(xiàn)用戶登錄、注冊、鑒權(quán)
- SpringBoot實(shí)現(xiàn)登錄校驗(yàn)(JWT令牌)
- SpringBoot+JWT實(shí)現(xiàn)單點(diǎn)登錄完美解決方案
- Spring?Boot?JWT登錄授權(quán)使用(無感刷新)
相關(guān)文章
Java中多線程與并發(fā)_volatile關(guān)鍵字的深入理解
這篇文章主要給大家介紹了關(guān)于Java中多線程與并發(fā)_volatile關(guān)鍵字的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
Java幸運(yùn)28系統(tǒng)搭建數(shù)組的使用實(shí)例詳解
在本篇文章里小編給大家整理了關(guān)于Java幸運(yùn)28系統(tǒng)搭建數(shù)組的使用實(shí)例內(nèi)容,有需要的朋友們可以參考學(xué)習(xí)下。2019-09-09

