vaadin:从外部页面获取用户登录数据

vaadin: getting user logindata from external page

我写了一个普通的 html 登录表单,它转发到一个 vaadin 项目,我想在其中接收用户名和密码并检查其是否有效。但我在获取此请求时遇到问题。

当我在 UI class 的 init() 方法中添加请求处理程序时,我只能在第二次调用 vaadin 页面后获取请求数据(因为在第一次调用时初始化,处理程序尚未添加)

 @Override
protected void init(VaadinRequest vaadinRequest) {
    setContent(new MainComponent()); 
    VaadinSession.getCurrent().addRequestHandler(
            new RequestHandler() {
                @Override
                public boolean handleRequest(VaadinSession vaadinSession, VaadinRequest vaadinRequest, VaadinResponse vaadinResponse) throws IOException {
                    String username = vaadinRequest.getParameter("username");
                    return false;
                }
            });

所以我试图覆盖 VaadinServlet 方法 doPost,但它没有被触发。当我覆盖方法服务(HttpServletRequest 请求,HttpServletResponse 响应)时,此方法会为每个请求触发 serval 次,因此也不是获取用户数据的好地方。

那么解决这个问题的正确方法是什么?

可以直接通过传入init()的VaadinRequest对象读取请求参数:

@Override
protected void init(VaadinRequest vaadinRequest) {
    setContent(new MainComponent()); 
    String username = vaadinRequest.getParameter("username");            
}

它非常适合我: 用户是我的简单 class,包含用户名、姓名等

在会话中设置登录用户:

public void setLoggedUser(User loggedUser) {
        this.loggedUser = loggedUser;
        getUI().getSession().getSession().setAttribute("loggedUser", loggedUser);
    }

阅读用户:

loggedUser = (User) getUI().getSession().getSession().getAttribute("loggedUser"); //return null if not logged in

我不知道这是否是最佳解决方案,但至少它有效。也许这对某人有帮助。

这里是我所做的简短解释。我从另一个 url 的普通 html 登录公式的 post 值中检索 posted 用户名和密码,并查看它是否存在于数据库中。如果它存在,它 returns 结果,否则值 ERROR.

我扩展了 VaadinServlet 并像这样重写了方法服务

@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    super.service(request, response);

    String username = request.getParameter("username");
    if(username != null) { // called several times, only set when username is returned, otherwise the value remains "error"
        String password = request.getParameter("password");
        this.result = getResult(username, Encrypter.encryp(password));
    }
}

这是我从 UI

扩展而来的 class
@Override
protected void init(VaadinRequest vaadinRequest) {        
    MyServlet myServlet = (MyServlet) VaadinServlet.getCurrent();
    String result = myServlet.getResult();

    if(result .equals(MyServlet.ERROR)){ // check if the result set in the servlet is valid, otherwise forward to the loginpage
        goToLogin();
        myServlet.resetResult();
        return;
    }
    myServlet.resetResult();

   ...
}

可能与谁有关 - 在 Vaadin 8 中获取请求和响应(可能在 Vaadin 7 中也可用):

 VaadinServletRequest vsRequest = (VaadinServletRequest) VaadinService.getCurrentRequest ();
 HttpServletRequest httpServletRequest = vsRequest.getHttpServletRequest ();

 VaadinServletResponse vsResponse = (VaadinServletResponse) VaadinService.getCurrentResponse ();
 HttpServletResponse httpServletResponse = vsResponse.getHttpServletResponse ();