给我写一个基于springboot 前后端分离 使用token实现用户登录的代码
时间: 2024-02-27 12:53:38 浏览: 148
好的,下面是一个基于Spring Boot前后端分离,使用Token实现用户登录的代码示例:
后端代码:
1. 定义一个JWT工具类,用于生成和解析Token。
```java
@Component
public class JwtUtils {
// Token过期时间为1小时
private static final long EXPIRATION_TIME = 60 * 60 * 1000;
// Token签名密钥
private static final String SECRET_KEY = "secret";
// Token前缀
private static final String TOKEN_PREFIX = "Bearer ";
/**
* 生成Token
*
* @param subject Token的主题,即用户ID
* @return Token字符串
*/
public static String generateToken(String subject) {
Date now = new Date();
Date expiration = new Date(now.getTime() + EXPIRATION_TIME);
String token = Jwts.builder()
.setSubject(subject)
.setIssuedAt(now)
.setExpiration(expiration)
.signWith(SignatureAlgorithm.HS512, SECRET_KEY)
.compact();
return TOKEN_PREFIX + token;
}
/**
* 解析Token
*
* @param token Token字符串
* @return Token主题,即用户ID
*/
public static String parseToken(String token) {
if (token != null && token.startsWith(TOKEN_PREFIX)) {
token = token.replace(TOKEN_PREFIX, "");
}
try {
Jws<Claims> claims = Jwts.parser()
.setSigningKey(SECRET_KEY)
.parseClaimsJws(token);
return claims.getBody().getSubject();
} catch (JwtException e) {
return null;
}
}
}
```
2. 在Controller中添加登录接口,用于验证用户登录,并生成Token。
```java
@RestController
@RequestMapping("/api/user")
public class UserController {
@PostMapping("/login")
public Result login(@RequestBody User user) {
// 验证用户账号密码是否正确,这里省略具体实现
if ("admin".equals(user.getUsername()) && "123456".equals(user.getPassword())) {
// 如果账号密码正确,则生成Token
String token = JwtUtils.generateToken("1");
return Result.success(token);
} else {
return Result.error("账号或密码错误");
}
}
}
```
3. 在Spring Boot的配置类中配置拦截器,用于验证Token是否有效。
```java
@Configuration
public class WebConfig implements WebMvcConfigurer {
// 添加拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new HandlerInterceptorAdapter() {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 从请求头中获取Token
String token = request.getHeader("Authorization");
// 验证Token是否有效
String userId = JwtUtils.parseToken(token);
if (userId != null) {
request.setAttribute("userId", userId);
return true;
} else {
// Token无效,返回401 Unauthorized
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
return false;
}
}
}).addPathPatterns("/api/**"); // 拦截所有/api/**的请求
}
}
```
前端代码:
1. 在登录页面中,获取用户输入的账号密码,并发送登录请求。
```html
<form>
<div class="form-group">
<label for="username">用户名:</label>
<input type="text" class="form-control" id="username" name="username">
</div>
<div class="form-group">
<label for="password">密码:</label>
<input type="password" class="form-control" id="password" name="password">
</div>
<button type="button" class="btn btn-primary" onclick="login()">登录</button>
</form>
```
```javascript
function login() {
var username = $("#username").val();
var password = $("#password").val();
$.ajax({
url: "/api/user/login",
type: "POST",
contentType: "application/json;charset=UTF-8",
data: JSON.stringify({username: username, password: password}),
success: function (result) {
if (result.code == 200) {
// 登录成功,将Token存入LocalStorage
localStorage.setItem("token", result.data);
window.location.href = "/index.html";
} else {
// 登录失败,显示错误信息
alert(result.msg);
}
}
});
}
```
2. 在其他页面中,需要从LocalStorage中获取Token,并在请求头中添加Authorization字段。
```javascript
$(function () {
var token = localStorage.getItem("token");
$.ajax({
url: "/api/user",
type: "GET",
headers: {
"Authorization": token
},
success: function (result) {
if (result.code == 401) {
// 用户未登录,跳转到登录页面
window.location.href = "/login.html";
}
}
});
});
```
以上就是一个基于Spring Boot前后端分离,使用Token实现用户登录的代码示例,希望能对你有所帮助。
阅读全文