【问题标题】:Redirect Vaadin App重定向 Vaadin 应用程序
【发布时间】:2017-03-29 08:22:30
【问题描述】:

我目前在 openshift 上托管我的 vaadin 应用程序。单击登录按钮时,我的主网站会重定向到 vaadin 应用程序。用户首先看到的是登录页面

我的网站上有 2 个按钮,一个免费试用按钮和一个登录按钮,我的 vaadin 应用程序中有 2 个不同的课程,一个登录课程和一个免费试用课程。

如何使登录按钮重定向到我的 vaadin 应用程序的登录类,并将免费试用按钮重定向到我的 vaadin 应用程序的免费试用类?

这是它目前的样子:

@Theme("mytheme")
@Widgetset("com.example.myapp.MyAppWidgetset")
@PreserveOnRefresh
public class MyUI extends UI {

    @WebServlet(urlPatterns = "/*", name = "MyUIServlet", asyncSupported = true)
    @VaadinServletConfiguration(ui = MyUI.class, productionMode = false)
    public static class MyUIServlet extends VaadinServlet {
    }

    @Override
    protected void init(VaadinRequest vaadinRequest) {
        login();
    }

【问题讨论】:

  • 我倾向于在这里使用导航器。不过,您需要稍微重构一下代码。
  • @Chris M 谢谢!您对如何针对我的情况实施此操作有任何见解吗?我通读了文档,但我并不真正理解它。如何使用它将 www.trial.mywebsite.com 重定向到 trialUI 类并将 www.login.mywebsite.com 重定向到 LoginUI 类?

标签: redirect login vaadin trial


【解决方案1】:

您可以将一个参数传递给您的请求,并使用 UI 提供程序来根据此参数为 UI 提供服务。

here

例子:

public class DifferentFeaturesForDifferentClients extends UIProvider {

    @Override
    public Class<? extends UI> getUIClass(UIClassSelectionEvent event) {
        if ("trial".equalsIgnoreCase(event.getRequest().getParameter("app-type"))) {
            return TrialUI.class;
        } else {
            return LognUI.class;
        }
    }
}

web.xml:

<servlet>
    <servlet-name>My Vaadin App</servlet-name>
    <servlet-class>com.vaadin.server.VaadinServlet</servlet-class>
    <init-param>
        <description>Vaadin UI</description>
        <param-name>UIProvider</param-name>
        <param-value>com.example.myexampleproject.DifferentFeaturesForDifferentClients</param-value>
    </init-param>
</servlet>

然后在你的主要网站的html代码中:

<form>
    <input type="submit" name="app-type" value="Trial" formaction="/your/vaadin/url" formmethod="post"> 
    <input type="submit" name="app-type" value="Login" formaction="/your/vaadin/url" formmethod="post"> 

    <!-- Alternative using button tag (better for customization, but no IE < 9) -->
    <button name="app-type" value="trial" type="submit">Trial</button>
    <button name="app-type" value="login" type="submit">Login</button>
</form>

【讨论】:

  • 这似乎有道理,但我将如何将参数传递给我的请求?
  • 您可以在主网站中使用一个表单,该表单在使用按钮提交时传递 POST 参数,并将表单定位到您的 vaadin 应用程序的 url。
  • 相应地更新了答案
  • 好的,非常感谢!会试试这个。 Web.xml 必须按照您正确的方式进行编辑吗?而且我认为即使我的主网站和 vaadin 应用程序托管在不同的位置,这也会起作用?
  • 是的,您必须在 web.xml 中包含 UIProvider 的设置,并删除注释。如果它们托管在不同的位置,它应该可以工作,是的。我更新了代码以正确设置和检查参数。
【解决方案2】:

您可以像 Chris M 所说的那样使用 Navigator,也可以尝试实现事件驱动架构。我也使用 Vaadin 和 Google Guava 实现了一个类似的项目。

如果您有兴趣,可以在这里找到一些如何使用 Google Guava 的示例。 http://codingjunkie.net/guava-eventbus/

您可以在下面找到我的一些实现代码片段:

// Using guava
final Button signin = new Button(
                    Lang.getMessage("login.signin"), 
                    eventClick -> {BarsEventBus.post(new UserLoginRequestedEvent(
                            username.getValue(), password.getValue()));});


//Using Navigator, I also used spring here, so the registration view is a Spring View
final Button register = new Button(
                    Lang.getMessage("login.registration"), 
                    clickEvent -> {getUI().getNavigator().navigateTo(ViewToken.REGISTRO);}
                    );


@UIScope
@SpringView(name = ViewToken.REGISTRO)
public class RegistrationView extends VerticalLayout implements View {...}

请验证 vaadin 演示应用程序的代码。该代码也有一个关于如何处理它的示例。在这里找到它: https://github.com/vaadin/dashboard-demo

【讨论】:

    【解决方案3】:

    我现在明白你在做什么了。你可以很容易地做到这一点。您需要将 VaadinRequest 转换为 VaadinServletRequest。它传递 VaadinRequest 而不是 VaadinServletRequest 的原因是您也可以将应用程序部署为 portlet。在这种情况下,您需要将其转换为 VaadinPortletRequest。然后就可以使用用户提供的serverName了。

     @Override
        protected void init(VaadinRequest vaadinRequest) {
            VaadinServletRequest req = (VaadinServletRequest) vaadinRequest;
            String serverName = req.getServerName();
            if (serverName.equals("www.login.mywebsite.com"))
            {
               login();
            }
            else
            {
                trial();
            }
        }
    

    【讨论】:

    • 这几乎可以满足我的要求,但我正在将我的应用程序从 openshift 重定向到 login.mywebsite.com。您提供的代码为我提供了 openshift 的 URL,而不是 login.mywebsite.com 的 URL。你有办法解决这个问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多