Login Ayuda , gracias

Hola a todos

Estoy tratando de hacer una conexión funcional , tengo tres puntos de vista , uno se login y 2 ventanas pero con un menú superior, para navegar con Navigator , a mí entender mejor dejar mi código de abajo , si yo no me estoy inscrito debería siempre enviar la vista de inicio de sesión , si he conectado incorrectamente mí para enviar a la ventana de inicio de sesión, y si he entrado con éxito menuOne debo enviar mi ventana principal. El problema es que yo entro correctamente la sesión y se envía a la ventana principal, pero no muestra el menú … así que le agradecemos su ayuda para resolver este problema, que es el mismo al cerrar la sesión o si … Podían explicar qué otra manera puedo solucionar …

Mis códigos:

[code]
package com.vaadin.ricardo.proyecto.logintest;

import javax.servlet.annotation.WebServlet;

import com.vaadin.annotations.Theme;
import com.vaadin.annotations.VaadinServletConfiguration;
import com.vaadin.annotations.Widgetset;
import com.vaadin.navigator.Navigator;
import com.vaadin.server.VaadinRequest;
import com.vaadin.server.VaadinServlet;
import com.vaadin.ui.MenuBar;
import com.vaadin.ui.MenuBar.MenuItem;
import com.vaadin.ui.Panel;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;

@Theme(“mytheme”)
@Widgetset(“com.vaadin.ricardo.proyecto.logintest.MyAppWidgetset”)
public class MyUI extends UI {

@Override
protected void init(VaadinRequest vaadinRequest) {
    VerticalLayout layout = new VerticalLayout();
    MenuBar menu = new MenuBar();
    menu.setSizeFull();
    MenuItem mnuArchivo = menu.addItem("File", null);
    MenuItem mnuSalir = mnuArchivo.addItem("Close Sesion", null);
    MenuItem mnuModule = menu.addItem("Modules", null);
    MenuItem mnuWindowsOne = mnuModule.addItem("Windows One", null);
    MenuItem mnuWindowsTwo = mnuModule.addItem("Windows Two", null);
    layout.addComponent(menu);
    Panel p = new Panel("Modules");

    layout.addComponent(p);
    setContent(layout);
    Navigator nav = null;
    if (getSession().getAttribute("access")!=null && getSession().getAttribute("access")!="false") {
        System.out.println("VER1:"+getSession().getAttribute("access"));
        nav = new Navigator(this, p);
        nav.addView("", WindowsOne.class);
        nav.addView(LoginView.NAME, LoginView.class);
        nav.addView(WindowsOne.NAME, WindowsOne.class);
        nav.addView(WindowsTwo.NAME, WindowsTwo.class);
        MyUI.getCurrent().getNavigator().navigateTo("menuOne");

    } else {
        System.out.println("VER:"+getSession().getAttribute("access"));
        nav = new Navigator(this, this);
        nav.addView("", LoginView.class);
        nav.addView(LoginView.NAME, LoginView.class);
        nav.addView(WindowsOne.NAME, WindowsOne.class);
        nav.addView(WindowsTwo.NAME, WindowsTwo.class);
        MyUI.getCurrent().getNavigator().navigateTo("login");
        
    }

    mnuSalir.setCommand(new MenuBar.Command() {
        @Override
        public void menuSelected(MenuBar.MenuItem selectedItem) {
            getSession().close();
            MyUI.getCurrent().getNavigator().navigateTo("login");
        }
    });
    mnuWindowsOne.setCommand(new MenuBar.Command() {

        @Override
        public void menuSelected(MenuItem selectedItem) {
            MyUI.getCurrent().getNavigator().navigateTo("menuOne");
        }
    });
    mnuWindowsTwo.setCommand(new MenuBar.Command() {

        @Override
        public void menuSelected(MenuItem selectedItem) {
            MyUI.getCurrent().getNavigator().navigateTo("menuTwo");
        }
    });
}

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

}
[/code]Login:

[code]
package com.vaadin.ricardo.proyecto.logintest;

import com.vaadin.navigator.View;
import com.vaadin.navigator.ViewChangeListener;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.FormLayout;
import com.vaadin.ui.PasswordField;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;
public class LoginView extends VerticalLayout implements View{
public static final String NAME=“login”;
FormLayout form=new FormLayout();
public LoginView(){
final TextField txtUsername=new TextField(“UserName”);
final PasswordField txtPassword=new PasswordField(“Password”);
form.addComponent(txtUsername);
form.addComponent(txtPassword);
Button btn=new Button(“Log In”);
this.addComponent(form);
this.addComponent(btn);
btn.addClickListener(new ClickListener() {
@Override
public void buttonClick(Button.ClickEvent event) {
if(txtUsername.getValue().equals(“admin”) || txtPassword.getValue().equals(“admin”)){
getSession().setAttribute(“access”, “true”);
MyUI.getCurrent().getNavigator().navigateTo(“menuOne”);
}else{
getSession().setAttribute(“access”, “false”);
}
}
});

}

@Override
public void enter(ViewChangeListener.ViewChangeEvent event) {
}

}
[/code]Ventana 1:

package com.vaadin.ricardo.proyecto.logintest;

import com.vaadin.navigator.View;
import com.vaadin.navigator.ViewChangeListener;
import com.vaadin.ui.Label;
import com.vaadin.ui.VerticalLayout;
public class WindowsOne extends VerticalLayout implements View{
    public static final String NAME="menuOne";
    public WindowsOne(){
        this.addComponent(new Label("THIS IS MY WINDOWS ONE"));
    }

    @Override
    public void enter(ViewChangeListener.ViewChangeEvent event) {
  
    }
}

Ventana 2:

package com.vaadin.ricardo.proyecto.logintest;

import com.vaadin.navigator.View;
import com.vaadin.navigator.ViewChangeListener;
import com.vaadin.ui.Label;
import com.vaadin.ui.VerticalLayout;
public class WindowsTwo extends VerticalLayout implements View{
    public static final String NAME="menuTwo";
    public WindowsTwo(){
        this.addComponents(new Label("This is my windows two"));
    }

    @Override
    public void enter(ViewChangeListener.ViewChangeEvent event) {
  
    }
    
}

Hola Ricardo,
Para este tipo de cosas yo siempre intentaría apoyarme en algun Framework que te pueda gestionar el control de acceso a recursos, como Apache Shiro o Spring Security. Ahora con la integración de Vaadin y Spring, tienes también disponible un tipo de View que tiene en cuenta las listas de acceso, con lo que no tienes que preocuparte por el acceso a dicha vista si el usuario no se ha autenticado correctamente o si no tiene autorización para ver la pantalla.

Quizá esto te ayude:
[url=http://stackoverflow.com/questions/18605904/vaadin-7-1-spring-security-integration-running-in-tomcat-server/20168559#20168559]
http://stackoverflow.com/questions/18605904/vaadin-7-1-spring-security-integration-running-in-tomcat-server/20168559#20168559

Saludos
Fran
[/url]

Gracias Francisco, la verdad que si vi esos framework , pero igual me gustaria hacerlo mano en esta ocasion. He modificado el codigo y casi lo logro.

Pero el problema es que me cambia solo la direccion del navegador y no me envia a mnuOne y despues si refresco la pagina si me envia a la pagina correspondiente.

                [u]


getSession().setAttribute(“access”, “true”);
CREO QUE ACA ESTA EL PROBLEMA AUNQUE NO ENTIENDO:
MyUI.getCurrent().getNavigator().navigateTo(“menuOne”);

[/u]

package com.vaadin.ricardo.proyecto.logintest;

import com.vaadin.navigator.View;
import com.vaadin.navigator.ViewChangeListener;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.FormLayout;
import com.vaadin.ui.PasswordField;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;
public class LoginView extends VerticalLayout implements View{
     public static final String NAME="login";
   FormLayout form=new FormLayout();
    public LoginView(){
        final TextField txtUsername=new TextField("UserName");
        final PasswordField txtPassword=new PasswordField("Password");
        form.addComponent(txtUsername);
        form.addComponent(txtPassword);
        Button btn=new Button("Log In");
        this.addComponent(form);
        this.addComponent(btn);
        btn.addClickListener(new ClickListener() {
            @Override
            public void buttonClick(Button.ClickEvent event) {
                if(txtUsername.getValue().equals("admin") || txtPassword.getValue().equals("admin")){
                    getSession().setAttribute("access", "true");
                    MyUI.getCurrent().getNavigator().navigateTo("menuOne");
                    
                }else{
                    getSession().setAttribute("access", "false");
                }
            }
        });
         
    }

    @Override
    public void enter(ViewChangeListener.ViewChangeEvent event) {
    }

    
}
package com.vaadin.ricardo.proyecto.logintest;

import javax.servlet.annotation.WebServlet;

import com.vaadin.annotations.Theme;
import com.vaadin.annotations.VaadinServletConfiguration;
import com.vaadin.annotations.Widgetset;
import com.vaadin.navigator.Navigator;
import com.vaadin.server.VaadinRequest;
import com.vaadin.server.VaadinServlet;
import com.vaadin.ui.MenuBar;
import com.vaadin.ui.MenuBar.MenuItem;
import com.vaadin.ui.Panel;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;

@Theme("mytheme")
@Widgetset("com.vaadin.ricardo.proyecto.logintest.MyAppWidgetset")
public class MyUI extends UI {

    @Override
    protected void init(VaadinRequest vaadinRequest) {
        VerticalLayout layout = new VerticalLayout();
        MenuBar menu = new MenuBar();
        menu.setSizeFull();
        MenuItem mnuArchivo = menu.addItem("File", null);
        MenuItem mnuSalir = mnuArchivo.addItem("Close Sesion", null);
        MenuItem mnuModule = menu.addItem("Modules", null);
        MenuItem mnuWindowsOne = mnuModule.addItem("Windows One", null);
        MenuItem mnuWindowsTwo = mnuModule.addItem("Windows Two", null);
        layout.addComponent(menu);
        Panel p = new Panel("Modules");

        layout.addComponent(p);
        setContent(layout);
        Navigator nav = new Navigator(this, p);
        nav.addView("", WindowsOne.class);
            nav.addView(LoginView.NAME, LoginView.class);
            nav.addView(WindowsOne.NAME, WindowsOne.class);
            nav.addView(WindowsTwo.NAME, WindowsTwo.class);
        if (getSession().getAttribute("access")!=null && getSession().getAttribute("access")!="false") {
            System.out.println("VER1:"+getSession().getAttribute("access"));
            MyUI.getCurrent().getNavigator().navigateTo("menuOne");

        } else {
            System.out.println("VER:"+getSession().getAttribute("access"));
            
         
            LoginView login=new LoginView();
            this.setContent(login);
            
        }

        mnuSalir.setCommand(new MenuBar.Command() {
            @Override
            public void menuSelected(MenuBar.MenuItem selectedItem) {
                getSession().close();
                MyUI.getCurrent().getNavigator().navigateTo("login");
            }
        });
        mnuWindowsOne.setCommand(new MenuBar.Command() {

            @Override
            public void menuSelected(MenuItem selectedItem) {
                MyUI.getCurrent().getNavigator().navigateTo("menuOne");
            }
        });
        mnuWindowsTwo.setCommand(new MenuBar.Command() {

            @Override
            public void menuSelected(MenuItem selectedItem) {
                MyUI.getCurrent().getNavigator().navigateTo("menuTwo");
            }
        });
    }

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

De una vista rápida veo que una vez que construyes el navigator te falta añadirlo a la UI. Necesitas invocar en el init() de tu UI a:

this.setNavigator(nav); Fijate que luego intentas navegar via:
MyUI.getCurrent().getNavigator().navi…() pero tu UI no tiene fijado el navigator que has contruido.

Por cierto, si estas en init() puedes hacer “this” en lugar de MyUI.getCurrent().

Estimado:
Junto con saludar y agradeciendo, la idea es cargar el login sin el menu y cuando envio a la ventana principal y resto de ventanas ya tengan cargado el menu…

Con lo que tu me indicas y las modificaciones realizadas lamentablemente no he podido solucionar mi problema.

Atento a vuestos comentarios,

Saludos.

Con este pedazo de codigo, me logeo correctamente , pero me muestra la primera ventana sin el menu:

   Navigator nav = null;
        nav = new Navigator(this, p);
        if (getSession().getAttribute("access") != null && getSession().getAttribute("access") != "false") {
            nav = new Navigator(this, p);
            nav.addView("", WindowsOne.class);
            nav.addView(LoginView.NAME, LoginView.class);
            nav.addView(WindowsOne.NAME, WindowsOne.class);
            nav.addView(WindowsTwo.NAME, WindowsTwo.class);
            this.setNavigator(nav);
            this.getNavigator().navigateTo("menuOne");
        } else {
            nav = new Navigator(this, this);
            nav.addView("", LoginView.class);
            nav.addView(LoginView.NAME, LoginView.class);
            nav.addView(WindowsOne.NAME, WindowsOne.class);
            nav.addView(WindowsTwo.NAME, WindowsTwo.class);
            this.setNavigator(nav);
            this.getNavigator().navigateTo("login");

        }

Viendo el código por encima entiendo que tu expresión:
if (getSession().getAttribute(“access”) …
se está evaluando a false y estás construyendo un navigator al que le pasas como SingleComponentContainer la propia UI.

Esto qué significa, que cuando invoques al navigateTo() del navigator, el navigator modificará el contenido de la UI → hace un setContent(aLoginView).

Eso quiere decir que el Layout que definiste se borrará y se sustituirá por esa VISTA que será la de login.
Ahí aportas tus credenciales, que se cargan en sesión (entiendo que no es el momento de comentarte nada de esto porque tu pelea ahora mismo es navegar) y lo que haces es un navigate(“menuOne”).
Aquí tu instancia de navigator sustituye el content de tu UI, que era una loginView, por esta nueva instancia de WindowsOne.

Es decir, cuando cuando perdiste el layout como content, perdiste el menu. Cuando entraste evaluando a false las credenciales perdiste el layout.

Simplifica un poco tu lógica. Piensa que realmente haces dos cosas:

  1. construyes un navigator. (Elige una forma. O sustituyes el content de UI o el del Panel. Si estas en LoginOculta el menu o visualiza el menu para toda vista)
  2. decides dónde navegar en función de que tengas o no credenciales: LoginView o MenusOne

Te recuerdo que tienes los métodos enter() en las vistas para poder inicializarlos como sea necesario. Planta unos métodos de logging en ellos para que puedas ver cuando se invocan y te surjan ideas de cómo utilizarlos o no.

Gracias Omar, entiendo tu logica pero no puedo soportar no poder solucionar algo como esto y no quiero dejar el menu :(…ya que como tu explicas efectivamente podria quitarme problemas dejando el menu tal y como esta.

ahora, lo que si me serviria es saber como como puedo refrescar mi ventana, para recargar y verificara si la sesion esta iniciada, osea si el login es correcto ya no hacer MyUI.getCurrent().getNavigator().navigateTo(“menuOne”); sino que actualizar la pagina.

Seguro que lo expliqué fatal :slight_smile: Te invitaba a que prescindieras de instanciar dos navigator. Es que uno lo pierdes.

Haz que tu UI implemente ViewDisplay. Eso te obliga a implementar el método showView() y el navigator invocará a tu UI para ver que se encargue de la presentación de la vista

public void showView(View view) { if(view instanceof LoginView) { // haz menu invisible } p.setContent((Component)view); } Crea en tu UI por ejemplo el siguiente metodo:

public Navigator buildNavigator() {

            Navigator nav = new Navigator(this, this);
            nav.addView(LoginView.NAME, LoginView.class);
            nav.addView(WindowsOne.NAME, WindowsOne.class);
            nav.addView(WindowsTwo.NAME, WindowsTwo.class);
           // nav.setErrorView(ErrorView.class); 
           return nav;
  }

Ahora en el init

public void  init(VaadinRequest request) {
...
           this.setNavigator(buildNavigator());

           // Comprueba credenciales y elige donde navegar 

}

Me genera el siguiente error:

El error me lo tira en la siguiente linea Navigator nav = new Navigator(this, this); y me dice reference to Navigator is ambiguous
both constructor Navigator(UI,SingleComponentContainer) in Navigator and constructor Navigator(UI,ViewDisplay) in Navigator match

(Alt-Enter shows hints)

package com.vaadin.ricardo.proyecto.logintest;


import com.vaadin.annotations.Push;
import javax.servlet.annotation.WebServlet;

import com.vaadin.annotations.Theme;
import com.vaadin.annotations.VaadinServletConfiguration;
import com.vaadin.annotations.Widgetset;
import com.vaadin.navigator.Navigator;
import com.vaadin.navigator.View;
import com.vaadin.navigator.ViewDisplay;
import com.vaadin.server.VaadinRequest;
import com.vaadin.server.VaadinServlet;
import com.vaadin.ui.Component;
import com.vaadin.ui.MenuBar;
import com.vaadin.ui.MenuBar.MenuItem;
import com.vaadin.ui.Panel;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;

@Theme("mytheme")
@Widgetset("com.vaadin.ricardo.proyecto.logintest.MyAppWidgetset")
public class MyUI extends UI implements ViewDisplay{
    
    Panel p = new Panel("Modules");
    MenuBar menu = new MenuBar();
    @Override
    protected void init(VaadinRequest vaadinRequest) {
        VerticalLayout layout = new VerticalLayout();
        this.setNavigator(buildNavigator());
        
        menu.setSizeFull();
        MenuItem mnuArchivo = menu.addItem("File", null);
        MenuItem mnuSalir = mnuArchivo.addItem("Close Sesion", null);
        MenuItem mnuModule = menu.addItem("Modules", null);
        MenuItem mnuWindowsOne = mnuModule.addItem("Windows One", null);
        MenuItem mnuWindowsTwo = mnuModule.addItem("Windows Two", null);
        layout.addComponent(menu);
        

        layout.addComponent(p);
       // setContent(layout);
        if (getSession().getAttribute("access") != null && getSession().getAttribute("access") != "false") {
            
        }else{
           
        }
        mnuSalir.setCommand(new MenuBar.Command() {
            @Override
            public void menuSelected(MenuBar.MenuItem selectedItem) {
                getSession().close();
                MyUI.getCurrent().getNavigator().navigateTo("login");
            }
        });
        mnuWindowsOne.setCommand(new MenuBar.Command() {

            @Override
            public void menuSelected(MenuItem selectedItem) {
                MyUI.getCurrent().getNavigator().navigateTo("menuOne");
            }
        });
        mnuWindowsTwo.setCommand(new MenuBar.Command() {

            @Override
            public void menuSelected(MenuItem selectedItem) {
                MyUI.getCurrent().getNavigator().navigateTo("menuTwo");
            }
        });
    }

    @Override
    public void showView(View view) {
         if(view instanceof LoginView) {
             menu.setVisible(false);
         }
         p.setContent((Component)view);
    }
    public Navigator buildNavigator() {
            Navigator nav = new Navigator(this, this);
            nav.addView(LoginView.NAME, LoginView.class);
            nav.addView(WindowsOne.NAME, WindowsOne.class);
            nav.addView(WindowsTwo.NAME, WindowsTwo.class);
           // nav.setErrorView(ErrorView.class); 
           return nav;
   }
    @WebServlet(urlPatterns = "/*", name = "MyUIServlet", asyncSupported = true)
    @VaadinServletConfiguration(ui = MyUI.class, productionMode = false)
    public static class MyUIServlet extends VaadinServlet {
                
    }
}

Esto es prueba y error. :slight_smile:

new Navigator(this, (ViewDisplay) this);

Tienes comentada this.setContent(layout).

// nav.setErrorView(ErrorView.class);
requiere también
//nav.addView(ErrorView.NAME, ErrorView.class);

La pregunta de cerrar sesión creo que se comentó hace poco en el foro, está reciente.

Viernes 21.28h qué hacemos al ordenador?? :wink:
Buen finde