SpringBoot+Vue下的token

一.后端(Spingboot)
1.定义注解
在这里插入图片描述
2.定义TokenService类

@Service
public class TokenService {
    //生成token
    public String getToken(User user){
        String token = "";
        token = JWT.create().withAudience(user.getUserName()).sign(Algorithm.HMAC256(user.getUserPassword()));
        return token;
    }
}

3.编写拦截器

public class AuthenticationInterceptor implements HandlerInterceptor {
    @Autowired
    UserMapper userMapper;


    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String token = request.getHeader("Authorization");//获取token
        //不为映射到方法直接通过
        if(!(handler instanceof HandlerMethod)){
            return true;
        }
        HandlerMethod handlerMethod = (HandlerMethod)handler;
        Method method = handlerMethod.getMethod();
        //检查是否有passtoken注释,有则跳过认证
        if(method.isAnnotationPresent(PassToken.class)){
            PassToken passToken = method.getAnnotation(PassToken.class);
            if(passToken.required()){
                return true;
            }
        }
        //检测是否有需要用户权限的注解
        if(method.isAnnotationPresent(UserLoginToken.class)){
            UserLoginToken userLoginToken = method.getAnnotation(UserLoginToken.class);

            if(userLoginToken.required()){
                //执行认证
                if(token == null){
                    throw new RuntimeException("401");
                }
                //获取token中的username
                String userName;
                try{
                    userName = JWT.decode(token).getAudience().get(0);
                }catch (JWTDecodeException j){
                    throw new RuntimeException("401");
                }
                User user = userMapper.selectUserByName(userName);
                if(user == null){
                    throw new RuntimeException("401");
                }
                //验证token
                JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(user.getUserPassword())).build();
                try{
                    jwtVerifier.verify(token);
                }catch (JWTVerificationException e){
                    throw new RuntimeException("401");
                }
                return true;
            }
        }
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}

4.配置拦截器

@Configuration
public class MyPicConfig implements WebMvcConfigurer {
	@Bean
    public AuthenticationInterceptor authenticationInterceptor() {
        return new AuthenticationInterceptor();
    }
    
    //拦截所有请求,判断是否有@LoginRequired注解决定是否需要登录
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(authenticationInterceptor()).addPathPatterns("/**");
    }
    
}

5.使用
(1)不加@UserLoginToken注解默认通过

	@PostMapping("/login")
    public Object login(@RequestBody User user){
        JSONObject jsonObject = new JSONObject();
        User userForBase = userMapper.selectUserByName(user.getUserName());
        if(userForBase == null){
            jsonObject.put("message","登录失败,用户不存在");
            return jsonObject;
        }else{
            if(!userForBase.getUserPassword().equals(user.getUserPassword())){
                jsonObject.put("message","登录失败,密码错误");
                return jsonObject;
            }
            else{
                if(userForBase.getUserGrade() == 0){
                    jsonObject.put("message","您的信用分数过低,已被网站拦截");
                    return jsonObject;
                }
                String token = tokenService.getToken(userForBase);
                jsonObject.put("token",token);
                jsonObject.put("user",userForBase);
                return jsonObject;
            }
        }
    }

(2)添加注解则需要进行token检测

	@UserLoginToken
    @GetMapping("/getMessage")
    public String getMessage(){
        return "你已通过验证";
    }

二.前端(vue)
1.配置vuex(store/index.js)

export default new Vuex.Store({
  state: {
      token: localStorage.getItem('token')?localStorage.getItem('token'):'',
  },
  mutations: {
    setToken(state,token){
      state.token = token;
      localStorage.setItem("token",token);
    },
    delToken(state){
      state.token = '';
      localStorage.removeItem('token');
    }
  },
  actions: {
  },
  modules: {
  }
})

2.添加拦截器(main.js)

axios.interceptors.request.use(config => {
    //判断是否存在token,如果存在将每个页面header都添加token
    if(store.state.token){
        config.headers.common['Authorization'] = store.state.token
    }
    return config;
}, error => {

});

// http response 拦截器
axios.interceptors.response.use(
    response => {
        return response;
    },
    error => {
        if (error.response) {
            switch (error.response.data.message) {//若message为404则返回登录页
                case '401':
                    store.commit('delToken');
                    router.replace('/login');
            }
        }
    });

3.使用

				login(){
                if(!(this.userName!=''&&this.password!='')){
                    this.$message("请输入账号与密码!");
                    return;
                }
                let url = 'http://localhost:8080/user/login'
                axios.post(url,{userName:this.userName,userPassword:this.password}).then(res=>{
                    if(res.data['message']){
                        this.$message(res.data['message']);
                        return;
                    }
                    let token = res.data['token'];//token
                    this.$store.commit('setToken',token);
                    //console.log(window.localStorage['token']);  可以直接获取token值
                    //console.log(this.$store.state.token);
                    window.localStorage.setItem("username",this.userName);
                    this.$router.push('/forum');
                }).catch(err=>{
                    console.log(err);
                })
            }

三.参考文章
1.SpringBoot集成JWT实现token验证
2.Vue项目中的token验证登录(前端部分)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 Spring Boot 和 Vue.js 实现 token 验证的步骤如下: 1. 在 Spring Boot 后端实现 token 的生成和验证逻辑。 创建一个 TokenUtil 类,用于生成和验证 token。可以使用 Java JWT(jjwt)库来简化操作。 ```java import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.security.Keys; import org.springframework.stereotype.Component; import javax.crypto.SecretKey; import java.util.Date; @Component public class TokenUtil { private static final String SECRET_KEY = "your_secret_key_here"; private static final long EXPIRATION_TIME = 86400000; // 过期时间设置为一天 // 生成 token public String generateToken(String userId) { SecretKey key = Keys.hmacShaKeyFor(SECRET_KEY.getBytes()); return Jwts.builder() .setSubject(userId) .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME)) .signWith(key) .compact(); } // 验证 token public boolean validateToken(String token) { try { SecretKey key = Keys.hmacShaKeyFor(SECRET_KEY.getBytes()); Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token); return true; } catch (Exception e) { return false; } } // 获取 token 中的用户ID public String getUserIdFromToken(String token) { SecretKey key = Keys.hmacShaKeyFor(SECRET_KEY.getBytes()); Claims claims = Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token).getBody(); return claims.getSubject(); } } ``` 2. 在 Spring Boot 的控制器中添加 token 相关的接口。 创建一个 UserController 类,用于处理用户相关的请求。 ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/api") public class UserController { @Autowired private TokenUtil tokenUtil; @PostMapping("/login") public String login(@RequestBody User user) { // 验证用户登录逻辑,验证通过后生成 token if (authenticate(user.getUsername(), user.getPassword())) { String token = tokenUtil.generateToken(user.getUsername()); return token; } else { return "Invalid credentials"; } } @GetMapping("/user") public String getUserInfo(@RequestHeader("Authorization") String token) { // 验证 token 的有效性,并返回用户信息 if (tokenUtil.validateToken(token)) { String userId = tokenUtil.getUserIdFromToken(token); // 根据 userId 获取用户信息并返回 return "User: " + userId; } else { return "Invalid token"; } } private boolean authenticate(String username, String password) { // 用户登录验证逻辑 // 返回 true 表示验证通过,返回 false 表示验证失败 // 这里只做演示,实际情况需要根据实际业务逻辑进行验证 return username.equals("admin") && password.equals("password"); } } ``` 3. 在 Vue.js 前端发送登录请求,并使用获取到的 token 发送其他请求。 使用 axios 发送登录请求,并将获取到的 token 存储到浏览器的 localStorage 中。 ```javascript import axios from 'axios' const login = (username, password) => { return axios.post('/api/login', { username, password }) .then(response => { const token = response.data localStorage.setItem('token', token) }) } ``` 在其他需要验证身份的请求中,将存储的 token 添加到请求的头部 Authorization 中。 ```javascript import axios from 'axios' const getUserInfo = () => { const token = localStorage.getItem('token') const config = { headers: { 'Authorization': token } } return axios.get('/api/user', config) .then(response => { const userInfo = response.data return userInfo }) } ``` 这样,在发送请求时,后端会验证传递的 token 的有效性,并根据需要执行相应的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值