Проект Springboot требует проверки токена. Токен передается из внешнего интерфейса. Обычно мы пишем глобальный фильтр в проекте для проверки токена, передаваемого из внешнего интерфейса. Если есть интерфейсы, которые не требуют проверки токена, исключите эти интерфейсы. .Это тоже необходимо настроить.
Но здесь есть проблема, то есть не всегда можно настроить интерфейсы, не требующие проверки токена.
Итак, теперь нам нужно настроить аннотацию. Если вы думаете, к какому интерфейсу можно получить доступ без проверки токена, то просто напишите эту пользовательскую аннотацию для этого интерфейса.
Первый шаг — настроить аннотацию
/**
* исключить токен аннотация
* */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ExcludeTokenValidation {
}
Второй шаг — написать фильтр
@Slf4j
@Component
public class AuthInterceptor implements HandlerInterceptor {
private static final String TOKEN = "token";
@Autowired
private RedisUtil redisUtil;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {
if (handler instanceof HandlerMethod) {
HandlerMethod handlerMethod = (HandlerMethod) handler;
// Проверьте, имеет ли метод @ExcludeTokenValidation аннотация
if (handlerMethod.hasMethodAnnotation(ExcludeTokenValidation.class)) {
return true; // Если есть эта аннотация, передайте ее напрямую и не продолжайте token проверять
}
}
String token = request.getHeader(TOKEN);
// Получить токен из параметров
if (ObjectUtils.isEmpty(token)) {
token = request.getParameter(TOKEN);
}
if (!ObjectUtils.isEmpty(token)){
SysUser loginUser = getUser(token);
UserContext.setUser(loginUser);
} else{
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
output(response, noPermissionMsg("Нет соответствующего разрешения, обратитесь к администратору");
return false;
}
return true;
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
//Вручную очищаем пользовательский объект текущего пользовательского контекста
UserContext.remove();
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
}
/**
* Получить информацию о пользователе
* @param token
* @return
*/
private SysUser getUser(String token) {
Object o = redisUtil.get(token);
JSONObject userJson = JSONObject.parseObject(o.toString());
SysUser sysUser = JSON.toJavaObject(userJson, SysUser.class);
return sysUser;
}
/**
* возврат тела ответа
*
* @param response
* @param result
* @throws IOException
*/
private void output(HttpServletResponse response, Result<String> result) throws IOException {
response.setContentType("application/json;charset=UTF-8");
ServletOutputStream outputStream = null;
try {
outputStream = response.getOutputStream();
outputStream.write(JSON.toJSONString(result).getBytes(StandardCharsets.UTF_8));
} catch (IOException e) {
e.printStackTrace();
} finally {
outputStream.flush();
outputStream.close();
}
}
/**
* @param msg информация о сообщении
* @return Result<T> Возврат равномерно
*/
private Result<String> noPermissionMsg(String msg) {
String code = String.valueOf(HttpServletResponse.SC_FORBIDDEN);
Result<String> stringResult = ResultUtil.build(code, msg, null);
return stringResult;
}
}
Третий шаг — настроить этот фильтр для всей драмы.
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Bean
AuthInterceptor authlInterceptor() {
return new AuthInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
List<String> urls = new ArrayList<>();
urls.add("/favicon.ico");
urls.add("**/swagger-ui.html");
urls.add("/swagger-ui.html/**");
registry.addInterceptor(authlInterceptor()).addPathPatterns("/**").excludePathPatterns(urls);
}
}
Четвертый шаг — добавить эту пользовательскую аннотацию в интерфейс, который не требует проверки токена.
Шаг 5: После запуска проекта просто войдите в этот интерфейс.