java jwt和vue
时间: 2025-05-12 16:12:20 浏览: 19
<think>好的,我现在需要帮助用户了解如何在Java和Vue中使用JWT进行身份验证和授权。用户可能是一个正在开发前后端分离应用的开发者,想整合JWT来实现安全的用户认证和权限控制。我需要先回顾一下JWT的基本概念,然后分步骤讲解后端Java和前端Vue的实现方法。
首先,JWT由三部分组成:头部、载荷和签名。用户提供的引用中提到了JWT的结构,比如引用[2]中的示例,应该需要解释每个部分的作用。然后,Java后端部分,用户提到使用了Shiro和JWT依赖,引用[1]中的Maven依赖可能需要整合到教程里。另外,引用[3]提到了JWT过期异常,所以在实现时需要注意处理令牌的有效期。
接下来,我需要分步骤说明。后端部分可能需要创建JWT工具类,处理生成和验证令牌的逻辑。Shiro的整合可能涉及自定义Realm,将JWT作为认证方式。还要处理拦截器或过滤器,验证请求中的令牌是否有效。前端Vue部分需要处理登录后存储令牌,并在每次请求时携带Authorization头。同时,需要处理令牌过期的情况,比如跳转登录页面或刷新令牌。
还要考虑安全性,比如密钥管理、HTTPS的使用、存储方式(如HttpOnly的Cookie)。可能用户会遇到跨域问题,需要配置CORS。另外,引用[3]中的异常说明需要在后端处理过期令牌时返回相应的错误信息,前端根据错误进行提示或重新登录。
最后,生成相关问题,帮助用户进一步学习,比如优化方法、安全性问题、刷新令牌的实现等。整个教程需要结构清晰,代码示例正确,并参考用户提供的引用内容,确保信息准确。</think>以下是在Java和Vue中实现JWT身份验证和授权的完整技术方案:
### 一、后端Java实现(Spring Boot)
#### 1. 添加依赖(参考引用[1])
```xml
<!-- Shiro整合JWT -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
version>1.8.0</version>
</dependency>
<!-- JWT生成/验证 -->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.18.2</version>
</dependency>
```
#### 2. JWT工具类
```java
public class JwtUtil {
private static final String SECRET = "your-256-bit-secret";
private static final long EXPIRE = 7200; // 秒
public static String sign(String username) {
return JWT.create()
.withClaim("username", username)
.withExpiresAt(new Date(System.currentTimeMillis() + EXPIRE*1000))
.sign(Algorithm.HMAC256(SECRET));
}
public static DecodedJWT verify(String token) {
return JWT.require(Algorithm.HMAC256(SECRET)).build().verify(token);
}
}
```
#### 3. Shiro配置
```java
public class JwtRealm extends AuthorizingRealm {
@Override
public boolean supports(AuthenticationToken token) {
return token instanceof JwtToken;
}
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
String username = JwtUtil.getUsername(principals.toString());
// 从数据库获取角色权限信息
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
info.addRole("user");
return info;
}
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) {
String jwt = (String) token.getCredentials();
try {
DecodedJWT decoded = JwtUtil.verify(jwt);
return new SimpleAuthenticationInfo(jwt, jwt, getName());
} catch (JWTVerificationException e) {
throw new AuthenticationException("令牌失效");
}
}
}
```
### 二、前端Vue实现
#### 1. 登录处理
```javascript
axios.post('/api/login', {
username: 'user',
password: 'pass'
}).then(res => {
const token = res.data.token
localStorage.setItem('jwt', token)
axios.defaults.headers.common['Authorization'] = 'Bearer ' + token
})
```
#### 2. 请求拦截器
```javascript
axios.interceptors.request.use(config => {
const token = localStorage.getItem('jwt')
if (token) {
config.headers.Authorization = `Bearer ${token}`
}
return config
})
axios.interceptors.response.use(response => {
return response
}, error => {
if (error.response.status === 401) {
router.push('/login') // 处理令牌过期(参考引用[3])
}
return Promise.reject(error)
})
```
### 三、安全实践要点
1. **令牌存储**:推荐使用HttpOnly Cookie存储,防止XSS攻击
2. **密钥管理**:使用至少256位的密钥,推荐通过环境变量配置
3. **HTTPS**:必须启用HTTPS传输防止令牌截获
4. **刷新令牌**:实现双令牌机制(access_token + refresh_token)
### 四、常见问题处理
1. **令牌过期**(引用[3])
```java
try {
DecodedJWT decoded = JWT.require(Algorithm.HMAC256(SECRET))
.build()
.verify(token);
} catch (TokenExpiredException e) {
// 返回特定错误码给前端
throw new ExpiredJwtException("令牌已过期");
}
```
2. **跨域配置**
```java
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("http://localhost:8080")
.allowedMethods("*")
.allowedHeaders("*")
.exposedHeaders("Authorization");
}
}
```
阅读全文
相关推荐


















