首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >会话作用域Bean而不是会话作用域Bean

会话作用域Bean而不是会话作用域Bean
EN

Stack Overflow用户
提问于 2013-12-17 03:38:30
回答 2查看 3.2K关注 0票数 0

我有一个Primefaces项目,我的bean有以下注释:

代码语言:javascript
复制
@Named("reportTabBean")
@SessionScoped
public class ReportTabBean implements Serializable {
...
}

beans创建各种选项卡、树等。在用户访问应用程序之前,需要使用Shiro框架进行登录。由于某种原因,每个浏览器会话共享相同的选项卡、树等以及它们的状态。就像bean是应用程序的范围一样。我试过不同的显微镜,没有任何运气。但是,用户主体不被共享。我得到了正确的登录用户。

我都试过了

@javax.enterprise.context.SessionScoped

@javax.faces.bean.SessionScoped

没有运气。

我做错了什么?

编辑

我使用的是JDK 1.6.32。

这里有一个豆子:

代码语言:javascript
复制
@Named("reportTabBean")
@ViewScoped
public class ReportTabBean implements Serializable {
    private Map<String, TreeNode>   model; //Accordian menu which I want initiated upfront
    private int                     activeReportTypeIndex;
    private TreeNode                selectedNode;
    ....
    @PostConstruct
    public void createModel() {
        model = treeService.createModel();
    }

    public Map<String, TreeNode> getModel() {
        return model;
    }
    ....
    public void tabIsChanged(TabChangeEvent event) {
        FacesContext context = FacesContext.getCurrentInstance();
        Map<String, String> params = context.getExternalContext().getRequestParameterMap();
        AccordionPanel tabView = (AccordionPanel) event.getComponent();
        String activeIndexValue = params.get(tabView.getClientId(context) + "_tabindex");

        this.activeReportTypeIndex = Integer.parseInt(activeIndexValue);
    }

     public void onNodeSelect(final NodeSelectEvent event) {
        FacesContext.getCurrentInstance().getExternalContext().getSession(true);

        try {
            tabs.add(new ReportListTab(
                event.getTreeNode().getData().toString(),
                reportService.getReports(
                        ((FolderTreeNodeImpl) event.getTreeNode()).getReportType(),
                        ((FolderTreeNodeImpl) event.getTreeNode()).getFolderID()
                        )
                )
                );
         } catch (HibernateException e) {
           LOGGER.error("[onNodeSelect] HibernateException", e);

           FacesContext.getCurrentInstance().addMessage(":messages",
                new FacesMessage(
                        FacesMessage.SEVERITY_ERROR,
                        "Fatal Error",
                        "Please try again. If the error occurs, please contact the administrator."
                )
                );
        }
 }


}

@ViewScoped是org.omnifaces.cdi.ViewScoped,但不管我有什么作用域。它表现为应用范围。如果我在Chrome浏览器中的某个点以用户A的身份打开手风琴,用户B的Firefox手风琴中的同一点也将被打开。手风琴菜单的定义如下:

代码语言:javascript
复制
<h:form>                            
        <p:accordionPanel value="#{reportTabBean.model.keySet().toArray()}" var="reportType" activeIndex="#{reportTabBean.activeReportTypeIndex}">

            <p:ajax event="tabChange" listener="#{reportTabBean.tabIsChanged}" />

            <p:tab title="${msg[reportType]}">

                <p:tree value="#{reportTabBean.model[reportType]}" var="node" dynamic="true" 
                    cache="true" selectionMode="single" selection="#{reportTabBean.selectedNode}" id="tree">

                    <p:ajax event="select" update=":tabViewForm" listener="#{reportTabBean.onNodeSelect}" />

                    <p:treeNode type="node" expandedIcon="folder-open" collapsedIcon="folder-collapsed">
                        <h:outputText value="#{node}" />
                    </p:treeNode>

                    <p:treeNode type="leaf" icon="document-node">
                        <h:outputText value="#{node}" />
                    </p:treeNode>

                </p:tree>

            </p:tab>
        </p:accordionPanel>
    </h:form>

下面是我的POM依赖项:

代码语言:javascript
复制
<dependencies>
        <!-- OmniFaces -->
        <dependency>
            <groupId>org.omnifaces</groupId>
            <artifactId>omnifaces</artifactId>
            <version>1.6.3</version> <!-- Or 1.7-SNAPSHOT -->
        </dependency>
        <dependency>
            <groupId>com.sun</groupId>
            <artifactId>tools</artifactId>
            <version>1.6</version>
        </dependency>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-web-api</artifactId>
            <version>6.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>6.0</version>
            <scope>provided</scope>
        </dependency>

        <!-- R -->
        <dependency>
            <groupId>net.rforge.REngine</groupId>
            <artifactId>REngine</artifactId>
            <version>1.7</version>
        </dependency>
        <dependency>
            <groupId>net.rforge.Rserve</groupId>
            <artifactId>Rserve</artifactId>
            <version>1.7</version>
        </dependency>

        <!-- Log4J -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.6.1</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.6.1</version>
        </dependency>
        <dependency>
            <artifactId>log4j</artifactId>
            <groupId>log4j</groupId>
            <type>jar</type>
            <version>1.2.16</version>
        </dependency>

        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>2.2</version>
        </dependency>

        <!-- Spring -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>3.1.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>3.1.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>3.1.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-web</artifactId>
            <version>3.1.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-config</artifactId>
            <version>3.1.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>3.1.4.RELEASE</version>
            <!-- will come with all needed Spring dependencies such as spring-core 
                and spring-beans -->
        </dependency>

        <!-- Hibernate -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>4.1.9.Final</version>
            <!-- will come with Hibernate core -->
        </dependency>

        <dependency>
            <groupId>org.glassfish.web</groupId>
            <artifactId>el-impl</artifactId>
            <version>2.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>el-api</artifactId>
            <version>6.0.32</version>
            <type>jar</type>
            <scope>provided</scope>
        </dependency>

        <!-- PrimeFaces -->
        <dependency>
            <groupId>org.primefaces</groupId>
            <artifactId>primefaces</artifactId>
            <version>4.0</version>
        </dependency>
        <dependency>
            <groupId>org.primefaces</groupId>
            <artifactId>primefaces-mobile</artifactId>
            <version>0.9.4</version>
        </dependency>

        <!-- JSF -->
        <dependency>
            <groupId>com.sun.faces</groupId>
            <artifactId>jsf-api</artifactId>
            <version>2.1.7</version>
        </dependency>
        <dependency>
            <groupId>com.sun.faces</groupId>
            <artifactId>jsf-impl</artifactId>
            <version>2.1.7</version>
        </dependency>

        <dependency>
            <groupId>javax.inject</groupId>
            <artifactId>javax.inject</artifactId>
            <version>1</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
            <version>3.8.1</version>
        </dependency>

        <!-- Oracle -->
        <dependency>
            <groupId>com.oracle</groupId>
            <artifactId>ojdbc6</artifactId>
            <version>ojdbc6</version>
        </dependency>
        <dependency>
            <groupId>com.oracle</groupId>
            <artifactId>xdb</artifactId>
            <version>11.2.0</version>
        </dependency>
        <dependency>
            <groupId>com.oracle</groupId>
            <artifactId>xmlparserv2</artifactId>
            <version>11.2.0</version>
        </dependency>

        <!-- Apache Shiro authentication/authorization framework -->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-core</artifactId>
            <version>1.1.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-web</artifactId>
            <version>1.1.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-aspectj</artifactId>
            <version>1.1.0</version>
        </dependency>
    </dependencies>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-17 20:26:26

修好了!事实证明,这是因为我使用Spring,我需要使用Spring的范围注释,而不是JSF。

代码语言:javascript
复制
@Scope("session")

而不是那样

代码语言:javascript
复制
@SessionScoped

我从this thread那里找到了解决方案。

票数 0
EN

Stack Overflow用户

发布于 2013-12-17 05:10:22

由于您使用的是@Named,所以您应该使用来自javax.enterprise.context包的@SessionScoped和来自CDI的@SessionScoped

由于某种原因,每个浏览器会话共享相同的选项卡、树等以及它们的状态。就像bean是应用程序范围一样

访问同一个web应用程序的每个浏览器选项卡都将共享相同的用户会话,因此@SessionScoped bean不像@ApplicationScoped那样运行。如果您在不同的浏览器(如Chrome和Firefox )中打开相同的web应用程序,您会发现您正在使用两个完全不同的会话。

通过对问题的描述,您需要使用@ViewScoped。如果您正在使用Java 7,您可以使用JSF2.2:@javax.faces.view.ViewScoped附带的这个范围。如果您正在使用Java 6或早期版本,最简单的解决方案将是使用 from OmniFaces (请注意,您至少需要OmniFaces 1.6 ),或者使用 from MyFaces CODI

有关的Q/As:

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20625488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档