我需要在每个页面加载之前进行一些检查,以查看是否需要将用户重定向到另一个页面(出于安全原因)。
当我使用JSF 2.0时,我使用了一个阶段监听器来完成这项工作。现在我正在使用JSF 2.2并且我的所有bean都不再是JSF bean了,但是CDI bean,我认为我提供了更好的选择(或者没有?)。
我听说过viewAction
事件,但我不想在每个页面上重复元数据(只有在没有其他选项的情况下)。
那么在带有CDI的JSF 2.2中实现这种情况的最佳方法是什么?
更新(在@skuntsel建议之后)
这是我现在使用的过滤器。我想在验证后才使用它来简化代码。顺便说一句,如果你能看到任何错误,如果你告诉我,我将不胜感激。
@WebFilter("/*")
public class SolicitacoesFilter implements Filter
{
// I can't just use @Inject private User _user, because it needs to be initialized
// only when the user is authenticated. Otherwise an exception is thrown. If this
// filter was called only after the authentication I could use the mentioned code.
private User _user;
@Inject
private Instance<User> _userGetter;
@Override
public void init(FilterConfig filterConfig) throws ServletException
{
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
{
if (initializeUser(request))
{
if (_user.isProvisoryPassword())
{
// Redirect to another page...
return;
}
if (_user.getStatus() != Status.ACTIVE)
{
// Redirect to another page...
return;
}
}
chain.doFilter(request, response);
}
@Override
public void destroy()
{
}
private boolean initializeUser(ServletRequest request)
{
boolean userAuthenticated = ((HttpServletRequest) request).getUserPrincipal() != null;
if (userAuthenticated)
{
if (_user == null)
{
_user = _userGetter.get();
}
}
else
{
_user = null;
}
return _user != null;
}
}
答案 0 :(得分:0)
好的,重定向需求的目的是什么?
我们假设:http://www.domain.com/login.jsf有登录表单。 一旦用户触发连接按钮,我们希望将他重定向到http://www.domain.com/member/welcome.jsf,并避免其他人不访问member / welcome.jsf域,我的意思是http://www.domain.com/member/中的所有页面{3}} ....
这里有一个简单的设计:
@WebFilter("/member/*")
public class SecurityCheck implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
HttpSession session = request.getSession();
if (session == null || session.getAttribute("User") == null) {
response.sendRedirect(request.getContextPath() + "/index.xhtml"); // No logged-in user found, so redirect to login page.
} else {
chain.doFilter(req, res); // Logged-in user found, so just continue request.
}
}
@Override
public void destroy() {
// Cleanup global variables if necessary.
}
其他情况,请使用:
<h:link></h:link>,or <h:commandLink></h:commandLink> // Checking in the managed Beans method
您也可以使用xml文件进行重定向。