如何从过滤器内部获取 SessionScoped CDI bean? [英] How do I get a SessionScoped CDI bean from inside a Filter?

查看:28
本文介绍了如何从过滤器内部获取 SessionScoped CDI bean?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这个问题与上一个关于编写一个会话超时处理程序.

This question is related to a previous one on writing a session timeout handler.

该线程中的答案涉及从 servlet 访问各种会话范围的托管 bean.建议(如此处所示)是在过滤器:

The answer in that thread involved accessing various session-scoped managed beans from the servlet. The recommendation (as seen here) is to do this in the filter:

HttpSession session = request.getSession(false);
User user = (session != null) ? (User) session.getAttribute("user") : null;

大概这会获取 User 类的会话 bean.问题是这不起作用.

Presumably this fetches a session bean of class User. The problem is this doesn't work.

问题是 bean 存在于会话属性中,但它们由 Weld 设施包装.我编写了 doFilter() 方法如下:

What goes wrong are that the beans are there in the session attributes, but they are wrapped by Weld facilities. I wrote the doFilter() method as follows:

public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain)
        throws IOException, ServletException {
    HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse res = (HttpServletResponse) response;

    String sp = req.getServletPath();
    System.out.println("------------------------");
    System.out.println("doFilter(): " + sp);

    if (!sp.startsWith("/javax")) {  // eliminates many requests
        HttpSession session = req.getSession();
        Enumeration<String> en = session.getAttributeNames();
        int count = 0;            
        while (en.hasMoreElements()) {
            String e = en.nextElement();
            System.out.println("Attribute " + ++count + ": " + e);
        }
    }
    chain.doFilter(request, response);
}

当这转储会话属性时,我通常会得到如下内容:

When this dumps out the session attributes, I typically get something like this:

INFO: ------------------------
INFO: doFilter(): /Display.xhtml
INFO: Attribute 1: org.jboss.weld.context.http.HttpSessionContext#org.jboss.weld.bean-WEB-INF/lib/myfaces-extcdi-bundle-jsf20-1.0.1-ManagedBean-class org.apache.myfaces.extensions.cdi.jsf.impl.scope.conversation.EditableWindowContextManagerProxy
INFO: Attribute 2: org.jboss.weld.context.http.HttpSessionContext#org.jboss.weld.bean-MyApp5-ManagedBean-class com.app.Login
INFO: Attribute 3: org.jboss.weld.context.conversation.ConversationIdGenerator
INFO: Attribute 4: com.sun.faces.renderkit.ServerSideStateHelper.LogicalViewMap
INFO: Attribute 5: org.jboss.weld.context.ConversationContext.conversations
INFO: Attribute 6: facelets.ui.DebugOutput
INFO: Attribute 7: javax.faces.request.charset
INFO: Attribute 8: org.apache.myfaces.extensions.cdi.core.api.scope.conversation.WindowContext:EXISTING_WINDOW_ID_LIST

属性#2 似乎代表了我想要的 bean.不用说,调用 session.getAttribute("login") 是行不通的.

Attribute #2 seems to represent the bean that I want. Needless to say a call to session.getAttribute("login") doesn't work.

谁能告诉我如何访问底层的托管 bean?我更愿意以一种与 Weld 无关的方式来做,但这可能是不可能的.

Can anyone say how to access the underlying managed bean? I would prefer to do it in a way that was not tied to Weld, but that may not be possible.

推荐答案

此方法仅适用于会话范围的 JSF @ManagedBean,不适用于 CDI @Named bean.

This approach works for session scoped JSF @ManagedBean only, not for CDI @Named bean.

您需要@Inject 它作为过滤器的一个属性.

You need to @Inject it as a property of the filter.

@Inject
private User user;

这篇关于如何从过滤器内部获取 SessionScoped CDI bean?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆