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/*
它首先将他重定向到登录页面,然后再重定向到他首先输入的URLhttp://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
,因此SeamLoginListener.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