【问题标题】:Seam: Session component is null and taglibs are compiled in each requestSeam:会话组件为空,并且在每个请求中编译标记库
【发布时间】:2011-04-26 01:32:27
【问题描述】:

我对集群部署的应用程序进行了更改,以通过 Oracle SSO 和 Dynamic Directives 使用 servlet 过滤器进行身份验证。过滤器位于所有应用程序的前面(甚至在 Seam 过滤器的前面)。如果请求是 servlet 请求且主体为 null,则我重定向到 SSO 进行身份验证。

这确实有效,但开始发生一些奇怪的事情。在第一个请求时弹出的会话组件(pimUser)(我可以在调试页面中看到)在第二个请求中为空。我得到经典异常“@In 属性需要非空值:sessionFinalizer.pimUser”。

更重要的是,除了在 CustomIdentity 组件的自定义 CustomIdentity.logout() 方法中,我没有调用 EVENT 范围的组件 sessionFinalizer,覆盖了默认的 Seam Identity。

第三个也是陌生的,应用的标签库是在每次请求中编译的(看文末)。

让我感到奇怪的是,会话在每次请求后以某种方式结束,因此每次都会创建一个新会话。这可以解释为什么在第二个请求中不存在 Session-scoped 组件。但是,我不知道它是否能解释一遍又一遍地编译的标记库。

我还附上了过滤器的代码,以防万一我做错了什么。

关于什么可能是错误的以及如何验证它的任何想法?

欢呼!

package eu.emea.pim.prs.web.filters;

import java.io.IOException;
import java.util.ArrayList;

import javax.faces.context.FacesContext;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import eu.emea.pim.prs.model.security.Role;
import eu.emea.pim.prs.web.auth.OssoDirectivesEnum;
import eu.emea.pim.prs.web.auth.PrsIdentity;

/**
 * Filter that checks the request for authenticated user, and in the case no
 * user has authenticated, redirects to the SSO login screen.
 * 
 * @author fragkakm
 * 
 */
public class SsoFilter implements Filter {
    private static final Logger logger = LoggerFactory
        .getLogger(SsoFilter.class);


@Override
public void destroy() {
}

@Override
public void doFilter(ServletRequest servletRequest,
        ServletResponse servletResponse, FilterChain chain)
        throws IOException, ServletException {
    try {
        if (servletRequest instanceof HttpServletRequest) {
            logger.info("Filtering HttpServletRequest...");
            HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
            String user = null;
            // Try to get the authenticate user name
            try {
                user = httpServletRequest.getRemoteUser();
                logger.info("User from request: {}", user);
                if(httpServletRequest.getUserPrincipal() == null) {
                    logger.info("User principal is empty.");
                } else {                        
                    logger.info("User principal name is {}.", httpServletRequest.getUserPrincipal().getName());
                }

            } catch (Exception e) {
                user = null;
            }

            // If user is not authenticated then generate
            // dynamic directive for authentication
            if ((user == null) || (user.length() <= 0)) {
                logger
                        .info("HttpServletRequest not authenticated, sending directive 499...");
                ((HttpServletResponse) servletResponse).sendError(OssoDirectivesEnum.FORCE_AUTHENTICATION.getDirective(),
                        "Oracle SSO");
                if (FacesContext.getCurrentInstance() != null) {
                    FacesContext.getCurrentInstance().responseComplete();
                    logger
                            .info("Prevented JSF from processing response any more.");
                }
            } 
        }
    } catch (IOException e) {
        logger.error("SSO Filter exception...", e);
        throw e;
    }
    chain.doFilter(servletRequest, servletResponse);

}

@Override
public void init(FilterConfig arg0) throws ServletException {
    logger.info("Initializing SSO filter...");
}

}

还有控制台:

Oct 15, 2010 5:54:51 PM com.sun.facelets.compiler.TagLibraryConfig loadImplicit
INFO: Added Library from: zip:/u01/app/oracle/product/j2ee/user_projects/domains    /wls_domain/servers/prs-backend_419/tmp/_WL_user/prs2/54i92t/APP-INF/lib/jsf-impl-1.2_12.jar!/META-INF/mojarra_ext.taglib.xml
Oct 15, 2010 5:54:51 PM com.sun.facelets.compiler.TagLibraryConfig loadImplicit
INFO: Added Library from: zip:/u01/app/oracle/product/j2ee/user_projects/domains/wls_domain/servers/prs-backend_419/tmp/_WL_user/prs2/54i92t/APP-INF/lib/jboss-seam-ui-2.2.1.CR1.jar!/META-INF/s.taglib.xml
Oct 15, 2010 5:54:51 PM com.sun.facelets.compiler.TagLibraryConfig loadImplicit
INFO: Added Library from: zip:/u01/app/oracle/product/j2ee/user_projects/domains/wls_domain/servers/prs-backend_419/tmp/_WL_user/prs2/54i92t/APP-INF/lib/richfaces-ui-3.3.3.Final.jar!/META-INF/a4j.taglib.xml
Oct 15, 2010 5:54:51 PM com.sun.facelets.compiler.TagLibraryConfig loadImplicit
INFO: Added Library from: zip:/u01/app/oracle/product/j2ee/user_projects/domains/wls_domain/servers/prs-backend_419/tmp/_WL_user/prs2/54i92t/APP-INF/lib/richfaces-ui-3.3.3.Final.jar!/META-INF/rich.taglib.xml
Oct 15, 2010 5:54:51 PM com.sun.facelets.compiler.TagLibraryConfig loadImplicit
INFO: Added Library from: zip:/u01/app/oracle/product/j2ee/user_projects/domains/wls_domain/servers/prs-backend_419/tmp/_WL_user/prs2/54i92t/APP-INF/lib/richfaces-ui-3.3.3.Final.jar!/META-INF/jsp.taglib.xml
Oct 15, 2010 5:54:51 PM com.sun.facelets.compiler.TagLibraryConfig loadImplicit
INFO: Added Library from: zip:/u01/app/oracle/product/j2ee/user_projects/domains/wls_domain/servers/prs-backend_419/tmp/_WL_user/prs2/54i92t/APP-INF/lib/richfaces-ui-3.3.3.Final.jar!/META-INF/richfaces.taglib.xml
Oct 15, 2010 5:54:51 PM com.sun.facelets.compiler.TagLibraryConfig loadImplicit
INFO: Added Library from: zip:/u01/app/oracle/product/j2ee/user_projects/domains/wls_domain/servers/prs-backend_419/tmp/_WL_user/prs2/54i92t/APP-INF/lib/richfaces-ui-3.3.3.Final.jar!/META-INF/ajax4jsf.taglib.xml
Oct 15, 2010 5:54:51 PM com.sun.facelets.compiler.TagLibraryConfig loadImplicit
INFO: Added Library from: zip:/u01/app/oracle/product/j2ee/user_projects/domains/wls_domain/servers/prs-backend_419/tmp/_WL_user/prs2/54i92t/APP-INF/lib/jsf-facelets-1.1.14.jar!/META-INF/jsf-core.taglib.xml
Oct 15, 2010 5:54:51 PM com.sun.facelets.compiler.TagLibraryConfig loadImplicit
INFO: Added Library from: zip:/u01/app/oracle/product/j2ee/user_projects/domains/wls_domain/servers/prs-backend_419/tmp/_WL_user/prs2/54i92t/APP-INF/lib/jsf-facelets-1.1.14.jar!/META-INF/jsf-html.taglib.xml
Oct 15, 2010 5:54:51 PM com.sun.facelets.compiler.TagLibraryConfig loadImplicit
INFO: Added Library from: zip:/u01/app/oracle/product/j2ee/user_projects/domains/wls_domain/servers/prs-backend_419/tmp/_WL_user/prs2/54i92t/APP-INF/lib/jsf-facelets-1.1.14.jar!/META-INF/jsf-ui.taglib.xml
Oct 15, 2010 5:54:51 PM com.sun.facelets.compiler.TagLibraryConfig loadImplicit
INFO: Added Library from: zip:/u01/app/oracle/product/j2ee/user_projects/domains/wls_domain/servers/prs-backend_419/tmp/_WL_user/prs2/54i92t/APP-INF/lib/jsf-facelets-1.1.14.jar!/META-INF/jstl-core.taglib.xml
Oct 15, 2010 5:54:51 PM com.sun.facelets.compiler.TagLibraryConfig loadImplicit
INFO: Added Library from: zip:/u01/app/oracle/product/j2ee/user_projects/domains/wls_domain/servers/prs-backend_419/tmp/_WL_user/prs2/54i92t/APP-INF/lib/jsf-facelets-1.1.14.jar!/META-INF/jstl-fn.taglib.xml

【问题讨论】:

  • 我很确定你不能访问 FacesContext.getCurrentInstance() 因为请求没有被 FacesServlet 拦截。例如,请参阅以下问题:stackoverflow.com/questions/3256344
  • 你说得对,这仍然来自我之前做的一个实验,将 SSO 过滤器放在 Seam 过滤器之后 - 这没有多大意义,但我还是尝试了。

标签: jakarta-ee seam single-sign-on servlet-filters


【解决方案1】:

有同事指出我在过滤器中设置了header code后没有return;。添加return语句后,taglibs重新编译的问题得到解决。这导致该请求也被 SsoFilter 之后的其他过滤器(Seam 过滤器等)处理。

至于从会话中消失的喷射组件,这与设置为falserequired 属性有关。我用

手动弹出
Contexts.getSessionContext().set("user", user);

这个问题也解决了。

【讨论】:

  • 感谢您分享发生的事情 (+1)
猜你喜欢
  • 2012-05-14
  • 1970-01-01
  • 2011-01-09
  • 1970-01-01
  • 2019-06-05
  • 1970-01-01
  • 1970-01-01
  • 2016-01-18
  • 2013-07-26
相关资源
最近更新 更多