代码之家  ›  专栏  ›  技术社区  ›  Markos Fragkakis

seam:session组件为空,在每个请求中编译taglibs

  •  0
  • Markos Fragkakis  · 技术社区  · 16 年前

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

    这确实有效,但奇怪的事情开始发生。在第一个请求(我可以在调试页中看到)被拒绝的会话组件(pimuser)在第二个请求中为空。我得到了经典的异常“@in属性需要非空值:sessionfinalizer.pimuser”。

    更重要的是,除了在customIdentity组件的custom customIdentity.logout()方法中,我没有调用事件范围的组件sessionFinalizer,而是覆盖默认的Seam标识。

    第三,更奇怪的是,应用程序的标记库是在每个请求中编译的(查看文章的结尾)。

    在我看来,会话在每次请求之后都会以某种方式结束,因此每次都会创建一个新的会话。这将解释为什么会话范围的组件在第二个请求中不存在。但是,我不知道它是否能解释一遍又一遍地编译taglibs。

    我还附加了过滤器的代码,以防我做了严重错误的事情。

    有什么可能是错误的想法,以及如何验证它吗?

    再见!

    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
    
    1 回复  |  直到 13 年前
        1
  •  1
  •   Markos Fragkakis    16 年前

    一位同事指出我没有 return; 在过滤器中设置头代码之后。添加了返回语句后,TagLibs重新编译的问题得到了解决。这导致请求也由其他过滤器在ssofilter(seam过滤器等)之后处理。

    就从会话中消失的输出组件而言,这与 required 属性设置为 false . 我手动退出

    Contexts.getSessionContext().set("user", user);
    

    这个问题也解决了。