当前位置: 首页 > 知识库问答 >
问题:

HTTP 405,在基于SPRING-BOOT JSP的Web应用程序中嵌入VAADIN UI

隗昀
2023-03-14

我已经集成了Vaadin 7,将用户界面嵌入到基于Spring Boot的应用程序的一些JSP页面中,如Vaadin Book中所述。

尽管当我调用嵌入它的路径(通过SpringMVC控制器)时,名为“v-my-vaadin-UI”的UI被正确显示,但在与UI交互时,我得到了一个HTTP405错误。

URL上出现错误:

http://localhost:8080/v-我的vaadin ui/UIDL/?v-uiId=4

似乎是因为在Spring Boot中,默认情况下,所有控制器都只允许使用GET方法(正如这里所解释的,必须显式地允许POST)

已尝试在我的Spring Security配置中禁用CSRF并配置Vaadin相关路径:

http.authorizeRequests()
.antMatchers("/vaadinServlet/**", 
"/UIDL/**", 
"/v-my-vaadin-ui/UIDL/**", 
"/v-my-vaadin-ui/PUSH/**", 
"/HEARTBEAT/**", "/VAADIN/**").permitAll();
http.csrf().disable();

因为VAADIN集成不需要Spring管理的CSRF,但这并不能解决问题。

VAADIN应用程序非常基本:

@SpringUI(path = "v-my-vaadin-ui")
public class MyVaadinUI extends UI {

    private static final long serialVersionUID = -8129815147461786549L;

    @Override
    protected void init(VaadinRequest vaadinRequest) {

        final TextField name = new TextField("Name");
        final Button greetButton = new Button("Greet");

        greetButton.addClickListener(new ClickListener() {

            @Override
            public void buttonClick(ClickEvent event) {
                Notification.show("Hi " + name.getValue(), 
                                  Notification.Type.HUMANIZED_MESSAGE);
            }
        });

        VerticalLayout vl = new VerticalLayout(name, greetButton);
        vl.setSpacing(true);
        setContent(vl);
    }

}

但点击Vaadin按钮,响应代码为405,具体例外情况如下:

.w、 s.m.a.ResponseStatusExceptionResolver:解析处理程序[ResourceHttpRequestHandler[locations=[ServletContext resource[/],类路径资源[META-INF/resources/],类路径资源[resources/],类路径资源[static/],类路径资源[public/],解析程序=[org.springframework.web.servlet.resource]。PathResourceResolver@4a8756c3]]]:org。springframework。网状物HttpRequestMethodNotSupportedException:不支持请求方法“POST”

不幸的是,我没有找到任何方法来配置用户界面的POST方法作为一个简单的控制器,即通过

@RequestMapping(method = {RequestMethod.GET, RequestMethod.POST})

因为此批注不能用于Vaadin UI。

此外,如果我直接调用UI(即不通过Spring控制器)的URL:

http://localhost:8080/v-my-vaadin-ui

用户界面显示和工作完美。

知道是什么导致了这个问题吗?如何允许使用POST方法?

共有2个答案

轩辕远
2023-03-14

解决了的!!

该问题是由我在嵌入VAADIN应用程序时使用的JS脚本中出错引起的(我遵循了以下文档:https://vaadin.com/docs/-/part/framework/advanced/advanced-embedding.html)特别是“serviceUrl”参数的代码片段:

"serviceUrl": "helloworld/",

我理解为使用应用程序的名称进行设置,在我的例子中是“v-my-vaadin-ui”。

但正确的"serviceUrl"在我的情况下,仍然是默认的一个"vaadinServlet/"所以改变:

"serviceUrl": "v-my-vaadin-ui/",

"serviceUrl": "vaadinServlet/",

一切正常。

下面是JSP标记的完整代码,用于嵌入适用于我的vaadin应用程序:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@tag description="ajax widget tag" pageEncoding="UTF-8"%>

<%@attribute name="v_app_url"%>

<%-- Javascript as described here: https://vaadin.com/docs/-/part/framework/advanced/advanced-embedding.html --%>

<div>

    <div id="${v_app_url}" class="v-app myvaadinui" >
       <div class="v-app-loading"></div>
       <noscript>
        You have to enable javascript in your browser to use an application built with Vaadin.
       </noscript>
    </div>

    <script type="text/javascript">//<![CDATA[
        if (!window.vaadin)
            alert("Failed to load the bootstrap JavaScript: vaadinBootstrap.js");

            /* The UI Configuration */
            vaadin.initApplication("${v_app_url}", {
                "browserDetailsUrl": "${v_app_url}/",
                "serviceUrl": "vaadinServlet/",
                "widgetset": "com.vaadin.DefaultWidgetSet",
                "theme": "valo",
                "versionInfo": {"vaadinVersion": "7.4.4"},
                "vaadinDir": "/VAADIN/",
                "heartbeatInterval": 300,
                "debug": false,
                "standalone": false,
                "authErrMsg": {
                    "message": "Take note of any unsaved data, "+
                               "and <u>click here<\/u> to continue.",
                    "caption": "Authentication problem"
                },
                "comErrMsg": {
                    "message": "Take note of any unsaved data, "+
                               "and <u>click here<\/u> to continue.",
                    "caption": "Communication problem"
                },
                "sessExpMsg": {
                    "message": "Take note of any unsaved data, "+
                               "and <u>click here<\/u> to continue.",
                    "caption": "Session Expired"
                }
            });//]] >
     </script>

</div>
邵凯定
2023-03-14

您试用过这个附加组件吗?https://vaadin.com/directory#!插件/jsp集成

 类似资料:
  • 本文向大家介绍基于Spring Boot保护Web应用程序,包括了基于Spring Boot保护Web应用程序的使用技巧和注意事项,需要的朋友参考一下 如果在类路径上添加了Spring Boot Security依赖项,则Spring Boot应用程序会自动为所有HTTP端点提供基本身份验证。端点“/”和“/home”不需要任何身份验证。所有其他端点都需要身份验证。 要将Spring Boot S

  • 问题内容: 我正在设计一个简单的基于Web的应用程序。我是这个基于Web的领域的新手,我需要您提供有关设计模式的建议,例如应如何在Servlet之间分配职责,创建新Servlet的条件等。 实际上,我主页上的实体很少,而与每个实体相对应,我们几乎没有添加,编辑和删除等选项。之前,我为每个选项使用一个Servlet,例如Servlet1用于添加实体1,Servlet2用于编辑实体1,依此类推,这样我

  • 问题内容: 我正在设计一个简单的基于Web的应用程序。我是这个基于Web的领域的新手,我需要您提供有关设计模式的建议,例如如何在Servlet之间分配职责,创建新Servlet的标准等。 实际上,我主页上的实体很少,而与每个实体相对应,我们几乎没有添加,编辑和删除等选项。早些时候,我为每个选项使用一个Servlet,例如Servlet1用于添加实体1,Servlet2用于编辑实体1,依此类推,这样

  • 问题内容: 如何在基于Java的桌面应用程序中嵌入浏览器?我是否可以直接与嵌入式浏览器通信(而不是通过本地主机)……例如加载html文本,捕获onclick事件,获取表单值? 谢谢 问题答案: 查看Eclipse,它具有一个嵌入式浏览器,用户可以对其进行配置(它们支持多种浏览器)。 即使您通过AWT_SWT桥使用基于AWT的应用程序,也可能会嵌入他们的浏览器。 此文章可以帮助您开始。

  • 问题内容: 我在我的应用程序中使用Spring安全功能,但是我发现,当会话过期时,所有请求ajax返回页面login.jsp(不重定向,在http响应中,它放置所有html内容)即登录页面我的webapp。我在应用程序中使用了很多ajax请求,目标是返回某些错误代码,例如510,而不是登录页面。 没有invalid-session-url,我试图使invalid-session-url =“”,不

  • 主要内容:创建项目,在Eclipse中导入项目,运行项目从这篇文章开始,我们使用Spring-AOP框架编写实际的AOP应用程序。在开始使用Spring-WS框架编写第一个示例之前,必须确保已经按照Spring AOP安装配置教程中的说明正确设置了Spring-AOP开发运行环境。 现在我们继续来编写一个简单的基于控制台的Spring AOP应用程序,它用于演示AOP的概念。 先来看看要创建的项目的目录结构 - 创建项目 打开命令控制台,进入目录并执行