后端实现jwt鉴权和前端代码

后端springboot代码引入依赖

<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.1</version>
</dependency>

生成token
public class JWTUtil {

private static final String SECRET_KEY = "jiazhanqiu";
private static final long EXPIRATION_TIME = 86400000; // 24小时

/*
生成token
*/
public static String generateToken(User user) {
Date now = new Date();
Date expiration = new Date(now.getTime() + EXPIRATION_TIME);

String compact = Jwts.builder()
.setSubject(user.getName())
.setExpiration(expiration)
.signWith(SignatureAlgorithm.HS256, SECRET_KEY)
.compact();
System.out.println(compact);
return compact;
}
/*
判断token是否过期
*/

public static String getUserNameFromToken(String token) {
Claims claims = Jwts.parser()
.setSigningKey(SECRET_KEY)
.parseClaimsJws(token)
.getBody();

Date expiration = claims.getExpiration();
if (expiration.before(new Date())) {
throw new ExpiredJwtException(null, null, "Token has expired");
}

return claims.getSubject();
}
}


Controller代码
@RestController
public class UserController {

@Autowired
private IUserService userService;

@PostMapping("/login")
public Object login(@RequestBody User user) {
if (user.getAccount().equals("1") && user.getPassword().equals("1")) {
user.setName("贾湛秋");
String s = JWTUtil.generateToken(user);
return Result.success(s);
} else
return "fail";
}

@GetMapping("/test")
public Object test() {
return Result.success("成功");
}

}
token校验
@Component
public class JwtInterceptor implements HandlerInterceptor {

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String token = request.getHeader("Authorization");
if (token == null) {
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
System.out.println("无");
return false;
}
try {
String userName = JWTUtil.getUserNameFromToken(token);
System.out.println(userName);
return true;
} catch (Exception e) {
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
System.out.println("错");
return false;
}
}
}
添加全局拦截器
@Configuration
public class WebConfig implements WebMvcConfigurer {

@Autowired
private JwtInterceptor jwtInterceptor;

@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(jwtInterceptor)
.addPathPatterns("/**")
.excludePathPatterns("/login"); // 登录接口不拦截
}
}
前端vue配置
登录界面
<template>
    <div>
        <el-form ref="form" :model="form" label-width="80px">
            <el-form-item label="账号">
                <el-input v-model="form.account"></el-input>
            </el-form-item>
            <el-form-item label="密码">
                <el-input v-model="form.password" show-password></el-input>
            </el-form-item>
            <el-button type="primary" @click="onSubmit">登录</el-button>
        </el-form>
    </div>
</template>

<script>
import axios, { Axios } from 'axios';
export default {
    data() {
      return {
        form: {
         account: "",
         password: "",
        },
        token: "",
      }
    },
    methods: {
      onSubmit() {
        var _this = this;
            axios({
                method: "post",
                url: "/api/login",
                data: _this.form,
            }).then(function (resp) {
                if (resp.data.msg == "success") {
                    _this.token = resp.data.data;
                    alert(_this.token)
                    localStorage.setItem("token", _this.token);
                    _this.$router.replace({ path: '/test'});
                } else {
                    alert("登录失败");

                }
            });
      }
    }
}
</script>
测试vue
<template>
    <div>
        {{ token }}
        <el-button type="primary" @click="onSubmit">测试</el-button>
    </div>
</template>

<script>
import axios, { Axios } from 'axios';
export default {
    data() {
        return {
            token: "",
        }
    },
    mounted() {
        this.token = window.localStorage.getItem("token");
    },
    methods: {

        onSubmit() {
            var _this = this;
            axios({
                method: "get",
                url: "/api/test",
                headers: {
                    "Authorization": _this.token  // 添加自定义的 Authorization 头
                }
            }).then(function (resp) {
                if (resp.data.msg == "success") {
                    _this.$message({
                        message: "测试成功",
                        type: "success",
                    });
                } else {
                    alert("测试失败");

                }
            });
        }
    }
}
</script>
 



posted @   小趴菜且能喝66  阅读(1)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
历史上的今天:
2023-04-11 4.11每日总结
2023-04-11 4.11团队自拍
点击右上角即可分享
微信分享提示