Login Seam 3如何处理;重定向到“捕获视图”;登录后的功能?

Login Seam 3如何处理;重定向到“捕获视图”;登录后的功能?,login,seam3,Login,Seam3,这是我的用例。 我有一个登录页面,它是/public/login.xhtml。我的所有其他页面在到达之前都需要登录。它们位于/pages/目录中 我希望: 如果我的用户访问http://host/myapp/pages/*它首先将他重定向到登录页面,然后再重定向到他首先输入的URL 如果我的用户访问http://host/myapp/,它首先将他重定向到登录页面,然后再重定向到/pages/home.xhtml 如果我的用户访问http://host/myapp/public/login.xht

这是我的用例。

我有一个登录页面,它是
/public/login.xhtml
。我的所有其他页面在到达之前都需要登录。它们位于
/pages/
目录中

我希望:

  • 如果我的用户访问
    http://host/myapp/pages/*
    它首先将他重定向到登录页面,然后再重定向到他首先输入的URL
  • 如果我的用户访问
    http://host/myapp/
    ,它首先将他重定向到登录页面,然后再重定向到
    /pages/home.xhtml
  • 如果我的用户访问
    http://host/myapp/public/login.xhtml
    ,它首先将他重定向到登录页面,然后再重定向到
    /pages/home.xhtml
  • 如果我的用户访问
    http://host/myapp/public/login.xhtml
    并且已经登录,它将重定向到
    /pages/home.xhtml

  • 目前什么在工作?

    有了Seam 3(v3.1.0.Final)和Security+Faces模块,我的用例n°1就可以自动运行了

    @ViewConfig
    公共接口页面配置{
    静态枚举页{
    @ViewPattern(“/pages/*”)
    @LoginView(“/public/login.xhtml”)
    @洛格丁
    已登录的页面,
    }
    }
    
    我的问题是,我不明白Seam是如何工作的,如何重定向到“捕获视图”

    有了Seam 2,在我们的
    components.xml
    中很容易理解

    
    
    因此,我们捕获了事件
    notLoggedIn
    loginssuccessful
    ,以使用
    重定向
    组件处理该事件

    在Seam 3中,我没有找到该配置:似乎没有任何内容
    @LoggedInEvent
    ,也没有
    重定向

    通过该
    /index.htm
    文件实现第2个

    
    
    但对于我的第3点,我尝试了一些不完全有效的解决方案

    首先,我在
    login.xhtml
    中尝试了这一点:

    
    
    无论是否使用
    onPostback=“true”
    ,在我登录后,我仍然在登录页面中显示错误消息(两次):“无法找到与操作«{identity.login}的from view id«/public/login.xhtml»匹配的导航案例,结果为«success»。”。只有当我现在重新访问
    http://host/myapp/public/login.xhtml
    我的
    viewAction
    将我重定向到家中

    我还在
    faces config.xml
    中尝试了该导航规则:

    
    /public/login.xhtml
    #{identity.loggedIn}
    /pages/home.xhtml
    
    但是,我的用例n°1被禁用:每次登录时,我都被重定向到主页

    最后,对于我的第4点
    s:viewAction
    完成了这项工作



    那么,是否有人知道正确处理这4个用例(我认为是常见用例)的最佳实践,特别是第3点?

    用例编号1 SeamFaces在用户会话中存储最初请求的viewId,然后在成功登录后重新路由到该视图。它通过从Seam安全登录按钮截取导航并使用存储在SessionMap中的数据来实现这一点

    用例2-很好的重定向解决方案!你也可以用一个

    用例3-您的viewAction解决方案应该可以工作,但我相信您会遇到。您可以使用以下几种解决方案:

    1) 在登录方法中,您可以操作接缝面存储的seision映射,如本--(此解决方案由提供)


    2) 用于拦截登录视图的请求,如果您未登录,则重新通知您。

    最后,我做了以下操作

    
    
    因此,我删除了
    if=“#{identity.loggedIn}”
    ,以便调用重定向到的
    redirectToHome
    方法
    /pages/home.xhtml

    • 如果用户已通过身份验证,则会将其重定向到主页
    • 如果他没有,那么它会被重定向到主页,这会将他重定向到登录页面,这要感谢我的
      @ViewConfig
    以下是
    登录操作

    public void redirectToHome()引发IOException{
    重定向(externalContext.encodeActionURL(externalContext.getRequestContextPath()+“/pages/home.xhtml”);
    }
    
    当时我面临的问题是当我注销时。

    以下是我的注销操作:

    
    
    以及
    securityAction.logout()
    方法:

    public void注销(){
    identity.logout();
    如果(!conversation.isTransient()){
    会话结束();
    }
    }
    
    问题是我被重定向到登录页面(我想是@ViewConfig的功劳),但没有抛出
    PreLoginEvent
    ,因此Seam
    LoginListener.ObservePloginevent
    没有被调用,因此我以前的URL没有进入会话。因此,当我登录(注销后立即登录)时,我被困在登录页面上,但已登录

    感谢并且,我做了以下工作:在我的
    BaseAuthenticator
    authenticate
    方法中,我在身份验证后调用了该方法:

    private void overrideRedirectToLogin(){
    最后一个字符串PRE\u LOGIN\u URL=LoginListener.class.getName()+“\u PRE\u LOGIN\u URL”;
    final ExternalContext ExternalContext=FacesContext.getCurrentInstance().getExternalContext();
    final-Map sessionMap=externalContext.getSessionMap();
    String redirectURL=(String)sessionMap.get(PRE\u LOGIN\u URL);
    如果(重定向URL==null){
    最终HttpServletRequest请求=(HttpServletRequest)externalContext.getRequest();
    重定向URL=request.getRequestUR