答案 0 :(得分:1)
通常“测试连接”正在工作(登录表单后的绿线),但连接不起作用。这可能是由于处理标头(由过滤器或安全性配置引起)引起的。例如,我两次被击中:
我有相同的症状,问题是由使用日志记录引起的。 消除依赖性帮助摆脱了登录到H2控制台时找不到适用于08001/0 消息的驱动程序:
<dependency>
<groupId>org.zalando</groupId>
<artifactId>logbook-spring-boot-starter</artifactId>
</dependency>
我不确定是给定project的错误,还是使用/配置错误。
配置OAuth2的确也打了我。我需要从网络以及http安全性中排除h2-console uri。参见一些info here。查看摘要:
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(
securedEnabled = true,
jsr250Enabled = true,
prePostEnabled = true
)
@RequiredArgsConstructor
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
public void configure(WebSecurity web) {
web.ignoring().antMatchers("/h2-console/**");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
// only part of config is shown here...
.authorizeRequests()
.antMatchers("/",
"/error",
"/favicon.ico",
"/**/*.png",
"/**/*.gif",
"/**/*.svg",
"/**/*.jpg",
"/**/*.html",
"/**/*.css",
"/**/*.js",
"/h2-console/**")
.permitAll()
.antMatchers("/auth/**", "/oauth2/**").permitAll()
.anyRequest().authenticated()
.and()
.oauth2Login();
}
}
答案 1 :(得分:0)
就我而言,问题在于我实施了自定义过滤器(请参阅here,here和here),并且自定义HttpServletRequestWrapper
需要处理H2控制台登录请求,包含表单数据(包括驱动程序类输入)并将其解析为参数:
public class MyHttpServletRequestWrapper extends HttpServletRequestWrapper {
private String body;
public MyHttpServletRequestWrapper(HttpServletRequest request) {
super(request);
this.body = IOUtils.toString(request.getReader());
//...
}
@Override
public Enumeration<String> getParameterNames() {
if (!parsedParams)
parseParams();
List<String> result = Collections.list(super.getParameterNames());
result.addAll(parameters.keySet());
return Collections.enumeration(result);
}
private void parseParams() {
if (!body.isEmpty()) {
String[] rps = body.split("&");
for (String rp : rps) {
String[] kv = rp.split("=");
try {
parameters.put(kv[0], kv.length > 1 ? new String[]{URLDecoder.decode(kv[1], "UTF-8")} : new String[]{""});
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
parameters.setLocked(true);
parsedParams = true;
}
}
@Override
public Map<String, String[]> getParameterMap() {
if (!parsedParams)
parseParams();
Map<String, String[]> s = super.getParameterMap();
return Stream.concat(parameters.entrySet().stream(), s.entrySet().stream()).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
}
@Override
public String getParameter(String name) {
return parameters.get(name) != null ? parameters.get(name)[0] : super.getParameter(name);
}
@Override
public String[] getParameterValues(String name) {
String[] s = super.getParameterValues(name);
return ArrayUtils.addAll(s, parameters.get(name));
}
}
答案 2 :(得分:0)
当我遇到此问题时,我正在遵循spring boot教程。在本教程中,我的Spring Boot指导在application.properties中使用了以下代码:
spring.h2.console.enabled=true
spring.datasource.platform=h2
spring.datasource.url=jdbc:h2:mem:someName
最后一行不是必需的,因为这些是Spring Boot完成的默认配置:
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.h2.console.enabled=false
当我删除它时,一切都按预期工作。
答案 3 :(得分:0)
只需添加我在这里遇到的问题和解决方案,因为我没有发现任何明确提及。
从Spring Boot 2.1升级到2.2时遇到了这个问题。 (测试时,我发现即使从最新的2.1.13.RELEASE切换到2.2.0.RELEASE,也出现了问题。)
分析: 我们的应用程序同时使用Jersey / JAX-RS和Spring Web。 要进行这项工作:
在Spring Boot 2.1上,我们的应用程序将Jersey配置为使用Servlet过滤器 使用(spring.jersey.type = filter),JerseyConfig使用ServletProperties.FILTER_FORWARD_ON_404将无法处理的请求转发给Spring Boot。 这似乎打破了Spring Boot 2.x中的h2-console。
对于Spring Boot 2.2,我删除了“ spring.jersey.type = filter”配置,以便Jersey使用servlet代替。 为了使它在Spring Web上很好用,我使用@ApplicationPath(“ / api”)限制了Jersey(无论如何,我们所有的JAX-RS请求都以该前缀开头)
答案 4 :(得分:-2)
在H2控制台中使用整个字符串进行连接,即,您将只看到您的表格
JDBC:H 2:〜/测试; DB_CLOSE_DELAY = -1; DB_CLOSE_ON_EXIT = FALSE; MV_STORE = FALSE; MVCC = FALSE