Redirect 重定向Vaadin应用程序

Redirect 重定向Vaadin应用程序,redirect,login,vaadin,trial,Redirect,Login,Vaadin,Trial,我目前正在openshift上托管我的vaadin应用程序。单击登录按钮后,我的主网站将重定向到vaadin应用程序。用户看到的第一件事是登录页面 我的网站上有两个按钮,一个免费试用按钮和一个登录按钮,我的vaadin应用程序中有两个不同的类,一个登录类和一个免费试用类 如何使登录按钮重定向到我的vaadin应用程序的登录类,使免费试用按钮重定向到我的vaadin应用程序的免费试用类 这就是它目前的样子: @Theme("mytheme") @Widgetset("com.example.mya

我目前正在openshift上托管我的vaadin应用程序。单击登录按钮后,我的主网站将重定向到vaadin应用程序。用户看到的第一件事是登录页面

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

如何使登录按钮重定向到我的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();
    }

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

例如:

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;
        }
    }
}
不同客户端的公共类差异功能扩展了UIProvider{
@凌驾

public Class您可以向请求传递一个参数,并根据此参数使用UI提供程序为UI提供服务

例如:

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;
        }
    }
}
不同客户端的公共类差异功能扩展了UIProvider{
@凌驾

public Class你可以像Chris M所说的那样使用导航器,或者你可以尝试实现一个事件驱动的架构。我也使用Vaadin和Google Guava实现了一个类似的项目

如果你有兴趣,你可以在这里找到一些如何使用谷歌番石榴的例子。

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

// 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演示应用程序的代码。该代码也有一个如何处理的示例。请在此处查找:

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

如果你有兴趣,你可以在这里找到一些如何使用谷歌番石榴的例子。

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

// 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演示应用程序的代码。该代码也有一个如何处理的示例。请在此处查找:

我现在理解了您要做的事情。您可以很容易地做到这一点。您需要将VaadinRequest转换为VaadinServletRequest。它传递VaadinRequest而不是VaadinServletRequest的原因是,您也可以将应用程序部署为portlet。在这种情况下,您需要将其转换为VaadinPortletRequest。Then您可以使用用户提供的服务器名

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

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

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

我倾向于在这里使用导航器。不过,您需要稍微重构一下代码。@Chris M谢谢!您对如何在我的情况下实现这一点有什么见解吗?我通读了文档,但我不太明白。我如何使用它将www.trial.mywebsite.com重定向到trialUI类并重定向到www.trialUI.login.mywebsite.com登录到LoginUI类?我倾向于在这里使用导航器。不过,您需要对代码进行一些重构。@Chris M谢谢!您对如何针对我的情况实现这一点有什么见解吗?我通读了这些文档,但我不太明白。我如何使用它重定向www.trial.mywebsite.com到trialUI类并将www.login.mywebsite.com重定向到LoginUI类?这似乎有道理,但我如何将参数传递到我的请求?您可以在主网站中使用一个表单,该表单在使用按钮提交时传递POST参数,并将表单指向您的vaadin应用程序的url。相应地更新了答案好的,非常感谢!我会尝试一下。Web.xml必须以正确的方式编辑。我假设即使我的主网站和vaadin应用程序托管在不同的位置,这也会起作用。是的,你必须在Web.xml中包含UIProvider的设置,并删除注释。如果它们托管在不同的t位置,是的。我更新了代码以正确设置和检查参数。这似乎有道理,但我如何将参数传递给我的请求?您可以在主网站中使用一个表单,该表单在使用按钮提交时传递POST参数,并将表单指向您的vaadin应用程序的url。根据提示更新了答案非常感谢!我会尝试一下。Web.xml必须以正确的方式编辑?我假设即使我的主网站和vaadin应用程序托管在不同的位置,这也会起作用?是的,你必须在你的Web.xml中包含UIProvider的设置,并删除注释。如果它们托管在不同的位置,这应该会起作用ons,是的。我更新了代码以正确设置和检查参数。这几乎符合我的要求,但我正在将我的应用程序从openshift重定向到login.mywebsite.com。您提供的代码为我提供openshift的url,而不是login.mywebsite.com。您对此有解决方法吗?这几乎符合我的要求,但我正在重定向我的应用程序从openshift到login.mywebsite.com的应用程序。您提供的代码为我提供了openshift的url,而不是login.mywebsite.com的url。您对此有解决方法吗?