我想根据用户访问权限限制对某些JSF页面的访问.如何在JSF中做到这一点?我找到了两个链接:通过直接更改JSF中的URL来限制用户访问页面.但答案没有提到如何阻止访问页面.用response.sendError?第二个链接:JSF:如何控制JSF中的访问权限和权限?
还有什么最好使用PhaseListener或使用ServletFilter?
我正在使用一个小型webapp来获得乐趣,目前只使用Java Servlet.我有两个页面,test1和test2.目前我在test1中创建一个新会话,如下所示:
HttpSession session = request.getSession(true);
if (session.isNew() == false) {
session.invalidate();
session = request.getSession (true);
}
Run Code Online (Sandbox Code Playgroud)
在test2中,我正在检索会话,如下所示:
HttpSession session = request.getSession(false);
if (session == null) {
throw new ServletException ("No session.");
}
Run Code Online (Sandbox Code Playgroud)
所以问题是如果我先去test2,我总是得到一个有效的会话,因为浏览器会创建一个.我想限制从test1到test2的流程,所以我必须先进入test1.我的计划是最终创建一个创建会话的登录页面,但我在这里看到的问题仍然存在.
我该怎么处理?我希望任何想法都不包括第三方库.我这样做是为了学习练习.
谢谢!
我正在开发一个Java EE应用程序(JSF2 + richfaces + Facelets + Tomcat).使用JSF时执行身份验证的最佳方法是什么?或者我应该自己做?
我目前正在使用PhaseListener如下方法来执行用户授权.
private PhaseId phaseId = PhaseId.RESTORE_VIEW;
@Override
public void afterPhase(PhaseEvent event) {
FacesContext fc = event.getFacesContext();
boolean isOnAllowedPage = false;
String[] allowedPages = choseRightPages(); // chose pages for role
for (String s : allowedPages) {
if (fc.getViewRoot().getViewId().lastIndexOf(s) > -1) {
isOnAllowedPage = true;
break;
}
}
if (!isOnAllowedPage) {
NavigationHandler nh = fc.getApplication().getNavigationHandler();
nh.handleNavigation(fc, null, "prohibited");
}
}
Run Code Online (Sandbox Code Playgroud)
它做我想要的,但我没有看到它列在如何处理数据库中的用户的身份验证/授权?而这个名为"使用phaselistener问题的授权"的Coderanch主题也提到了以下内容:
您不应该将与JSF紧密相关的授权结合在一起.更好地利用容器管理的身份验证和/或作用于覆盖受保护页面的url模式的简单过滤器.
我并不完全理解在执行用户授权时使用a PhaseListener而不是a 的限制Filter.有人可以向我解释一下吗?
我终于在页面之间传递了消息,但这并没有将我重定向到用户登录页面(../../index.xhtml),而是显示了禁止的页面:
public String permission() throws IOException {
FacesContext context = FacesContext.getCurrentInstance();
Map<String, Object> sessionMap = context.getExternalContext().getSessionMap();
String isLog = (String) sessionMap.get("isLogged");
if(isLog != "TRUE") {
System.out.println("*** The user has no permission to visit this page. *** ");
context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Info : ", "Loggez-vous"));
context.getExternalContext().getFlash().setKeepMessages(true);
//context.getExternalContext().redirect("../../index.xhtml");
return "../../index.xhtml?faces-redirect=true";
} else {
System.out.println("*** The session is still active. User is logged in. *** ");
}
return "../../index.xhtml?faces-redirect=true";
}
Run Code Online (Sandbox Code Playgroud)
当然,限制页面有这个:
<f:event type="preRenderView" listener="#{userloginMB.permission()}"/>
Run Code Online (Sandbox Code Playgroud)
使用get external context重定向会使消息丢失.