token
JwtInterceptor
package com.example.back.comment; import cn.hutool.core.util.StrUtil; import com.auth0.jwt.JWT; import com.auth0.jwt.JWTVerifier; import com.auth0.jwt.algorithms.Algorithm; import com.auth0.jwt.exceptions.JWTDecodeException; import com.auth0.jwt.exceptions.JWTVerificationException; import com.example.back.entity.Account; import com.example.back.exception.ServiceException; import com.example.back.mapper.AccountMapper; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerInterceptor; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.xml.ws.handler.Handler; //验证token身份 public class JwtInterceptor implements HandlerInterceptor { @Resource private AccountMapper accountMapper; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { String token = request.getHeader("token"); if (StrUtil.isBlank(token)) { token = request.getParameter("token"); } // 如果不是映射到方法直接通过 if (handler instanceof HandlerMethod) { AuthAccess annotation = ((HandlerMethod) handler).getMethodAnnotation(AuthAccess.class); if (annotation != null) { return true; } } // 执行认证 if (StrUtil.isBlank(token)) { throw new ServiceException("401", "请登录"); } // 获取 token 中的 user id String id; try { id = JWT.decode(token).getAudience().get(0); } catch (JWTDecodeException j) { throw new ServiceException("401", "请登录"); } // 根据token中的userid查询数据库 Account account = accountMapper.selById(Integer.valueOf(id)); //Account account = accountMapper.selectByNumber(id); if (account == null) { throw new ServiceException("401", "请登录"); } // 用户密码加签验证 token JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(account.getPassword())).build(); try { jwtVerifier.verify(token); // 验证token } catch (JWTVerificationException e) { throw new ServiceException("401", "请登录"); } return true; } }
InterceptorConfig
package com.example.back.comment; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; //拦截路由 @Configuration public class InterceptorConfig extends WebMvcConfigurationSupport { @Override protected void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(jwtInterceptor()) .addPathPatterns("/**") ; //拦截所有请求 // .excludePathPatterns("/login" , "/register"); //放行 super.addInterceptors(registry); } @Bean public JwtInterceptor jwtInterceptor() { return new JwtInterceptor(); } }
CORSConfig
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.UrlBasedCorsConfigurationSource; import org.springframework.web.filter.CorsFilter; @Configuration public class CORSConfig { // 当前跨域请求最大有效时长。这里默认1天 private static final long MAX_AGE = 24 * 60 * 60; @Bean public CorsFilter corsFilter() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); CorsConfiguration corsConfiguration = new CorsConfiguration(); corsConfiguration.addAllowedOrigin("*"); // 1 设置访问源地址 corsConfiguration.addAllowedHeader("*"); // 2 设置访问源请求头 corsConfiguration.addAllowedMethod("*"); // 3 设置访问源请求方法 corsConfiguration.setMaxAge(MAX_AGE); source.registerCorsConfiguration("/**", corsConfiguration); // 4 对接口配置跨域设置 return new CorsFilter(source); } }
Controller
@AuthAccess @PostMapping("/login") public Result login(@RequestBody Account account){ Account account1 = accountMapper.AccountLogin(account.getNumber(),account.getPassword()); System.out.println("11111111111111111111111111111"); if(account1 == null) { return Result.fail(); } else { String token = TokenUtils.createToken(String.valueOf(account1.getId()),account1.getPassword()); account1.setToken(token); return Result.suc(account1 , 1); } }
main.vue
axios({ url: "http://localhost:8080/search", method: "POST", data: this.selectUser, headers: { // 设置Token的请求头 "token": this.user.token } }).then(res=>{