春季启动的Vaadin登录问题
Posted
技术标签:
【中文标题】春季启动的Vaadin登录问题【英文标题】:Vaadin login issue with spring boot 【发布时间】:2021-08-10 03:24:01 【问题描述】:我对 Vaadin (v. 14.6.1) 和 Spring boot (v. 2.4.5) 有一个奇怪的问题。我已按照https://vaadin.com/learn/tutorials/securing-your-app-with-spring-security/setting-up-spring-security 中的说明来实现登录视图和安全设置。
当我加载应用程序并转到 localhost/8080 登录时,我输入了正确的凭据,但登录失败并显示消息
WARN 8184 --- [io-8080-exec-10] cvfscUidlRequestHandler : 从 0:0:0:0:0:0:0:1 收到的安全密钥无效
当我尝试使用相同的凭据再次登录时,登录成功。如果我注销并尝试再次登录,它工作正常。
我可以通过重新启动服务器并尝试再次登录来重现此问题。我在开发模式和生产模式下测试了这个问题,并得到了相同的行为。
【问题讨论】:
我不是 100% 确定,但它看起来像一个错误。如果收到的安全密钥与会话中存储的安全密钥不匹配,并且在第一个请求中您没有会话,则会引发异常。你能分享你的项目让我看看吗? 这里是代码的链接,github.com/lutfijd/VaadinLoginIssue 我可以重现该问题。我有一个类似的应用程序没有发生这个问题。我会及时通知你 谢谢 Simon,我可能应该早点澄清一下,我是 Vaadin 的新手,这是我正在试验的示例代码中的一个问题,请不要在上面花费太多时间。跨度> 【参考方案1】:我发现您的代码有两个问题:
-
SecurityUtils
ServletHelper
类已弃用,我认为这会导致问题。我用HandlerHelper
替换它:
public class SecurityUtils
/**
* Tests if the request is an internal framework request. The test consists of
* checking if the request parameter is present and if its value is consistent
* with any of the request types know.
*
* @param request
* @link HttpServletRequest
* @return true if is an internal framework request. False otherwise.
*/
static boolean isFrameworkInternalRequest(HttpServletRequest request)
final String parameterValue = request.getParameter(ApplicationConstants.REQUEST_TYPE_PARAMETER);
return parameterValue != null && Stream.of(HandlerHelper.RequestType.values())
.anyMatch(r -> r.getIdentifier().equals(parameterValue));
-
缺少 Vaadin 插件(如果您使用 Maven 运行它,则必须运行准备前端)
pom.xml
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.vaadin</groupId>
<artifactId>vaadin-maven-plugin</artifactId>
<version>$vaadin.version</version>
<executions>
<execution>
<goals>
<goal>prepare-frontend</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
【讨论】:
谢谢西蒙。在我添加您的更改之前,我尝试测试该应用程序并确保我仍然可以重现该问题,令我惊讶的是我不能。经过一段时间的挠头,我意识到我将应用程序上的服务器端口从 8080 更改为 80。不幸的是,您建议的更改在端口 8080 上并没有解决问题。我可以确认将服务器端口从 8080 更改到 80 实际上解决了这个问题,我反复使用不同的端口 # 启动服务器,以确保这不仅仅是侥幸。但问题始终在端口 80 上消失,并在端口 8080 上再次出现。 关于将 vaadin 前端插件添加到 pom 中,请记住这个 pom 是由 spring 初始化程序而不是我生成的,所以如果它不存在,我只能假设 Vaadin 团队或 spring 团队没有'认为他们在那里不需要它。以上是关于春季启动的Vaadin登录问题的主要内容,如果未能解决你的问题,请参考以下文章
我的春季启动webapp.war停止在ssh注销上运行。如何创建应用服务,以便在没有用户登录的情况下运行