在SpringBoot版本2.1.6中,无法拦截访问执行器请求,现在我有了一个全局拦截器
@Component
public class ServiceFilter implements HandlerInterceptor {
//log4j
static final Logger logger = LogManager.getLogger(ServiceFilter.class);
private final RateLimiter limiter = RateLimiter.create(Runtime.getRuntime().availableProcessors() * 2 + 1);
private final ThreadLocal<ExecuteRecordDto> executeRecord = new ThreadLocal<>();
public ServiceFilter() {
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
ExecuteRecordDto recordDto = ExecuteRecordDto.bulider(request);
executeRecord.set(recordDto);
if (!limiter.tryAcquire()) {
logger.warn("rate limiter ; json logger : {}",CommonUtil.toJSONString(recordDto));
response.getWriter().print(CommonUtil.toJSONString(ResultStatus.status(407, "rate limiter")));
return false;
}
if (ObjectUtils.isEmpty(request.getHeader("Authorization"))) {
logger.warn("illegal request, json logger : {} ",CommonUtil.toJSONString(recordDto));
response.getWriter().print(CommonUtil.toJSONString(ResultStatus.status(403, "Permission denied")));
return false;
}
switch (TokenHandle.checkToken(request.getHeader("Authorization"))) {
//正常放行token
case 0:
response.getWriter().print(CommonUtil.toJSONString(ResultStatus.status(407, "rate limiter")));
return true;
//token 过期
case 1:
response.getWriter().println(CommonUtil.toJSONString(ResultStatus.status(408, "Token expire")));
break;
//非法token
case 2:
logger.warn("illegal token, json logger : {} ",CommonUtil.toJSONString(recordDto));
response.getWriter().print(CommonUtil.toJSONString(ResultStatus.status(409, "Illegal token ")));
break;
default:
throw new RuntimeException("server runtime exception");
}
return true;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
ExecuteRecordDto recordDto = executeRecord.get();
logger.info("json logger : {}",CommonUtil.toJSONString(recordDto));
executeRecord.remove();
}
}
让它工作起来
@Configuration
public class ConfigFilter implements WebMvcConfigurer {
private final ServiceFilter filter;
@Autowired
public ConfigFilter(ServiceFilter filter){
this.filter = filter;
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(filter).addPathPatterns("/**");
}
}
执行器正在使用不同的HandlerMap(请参阅:org.springframework.boot.actuate.endpoint.web.servlet.WebMvcEndpoint HandlerMap
)。
由于顺序(-100 vs 0),此Handler映射将选择在您配置的Request HandlerMaps之上。您可以在DispatcherServlet
中看到这一点,正是方法HandlerExecutionChain getHandler(HttpServletRequest)
。
在我们的项目中,我们使用spring security配置对执行器endpoint的访问,因此我不知道是否有任何推荐的方法,但:
处理程序是按顺序选择的,因此这是需要考虑的事情,您还可以尝试操作执行器WebMvcEndpoint HandlerMap
。
就像我说的,我不确定正确的解决方案,但我希望它能指引你找到正确的解决方案。
问候,WiPu
我想将Spring启动执行器添加到我的应用程序,但当我添加此依赖项时 我得到以下错误 java.lang.reflect.InvocationTargetException at_NativeMethodAccessorImpl.invoke0(Native Method)at(...)由以下原因引起:org.springframework.beans.factory.不满意DependencyE
我正在尝试使用现有的Gradle Spring MVC项目设置Spring执行器。我无法使用@EnableAutoConfiguration。不幸的是,我无法到达执行器endpoint,我想我遗漏了一些东西。 项目中的Spring依赖项包括: 我正在尝试使用以下内容配置project: 在属性文件中,我添加了: 没有启用执行器endpoint,当尝试访问它们时,我得到404。我经历了许多相关问题,
我使用了不同端口的Spring启动执行器,如下所示 在应用程序中,我想在执行器端口中使用启用csrf=true,但我不想使用csrf。因为我想对jolokia使用批量POST请求。 只排除并不聪明。 下面的属性对我很好(bt管理。安全。启用csrf不存在)。 有什么好的解决办法吗?
我使用的是spring boot 2.0.0。M3带Spring防尘套启动器执行器。我启用了两项健康检查: healt check bean由自动配置创建,但不是由创建。的响应是404。 我做错了什么? 提前感谢 编辑: Mhm致动器项目是否与反应式和webflux一起工作?Ok发现了这个问题:https://github.com/spring-projects/spring-boot/issue
我正在尝试使用spring boot和hibernate。当我使用存储库时,它工作得很好,但我正在尝试使用Hibernate会话来创建DAO,而这个DAO不是事务的一部分。 这是测试代码: 应用Java语言 UserBusinessImpl。java: 用户存储库。Java语言 用户DAO: 当我尝试getCurrentSession()时,它抛出了一个错误。openSession()与我的事务分
我正在使用Spring boot,目前正在尝试访问http://localhost:8080/actuator但我得到404未找到。我不确定我在这里做错了什么。下面是我的pom依赖项- 属性文件配置 当我运行应用程序时,我确实在控制台中看到了这一点