Ala*_*ect 8 cdi jsf-2 servlet-filters
这个问题与前一个关于编写会话超时处理程序的问题有关.
该线程的答案涉及从servlet访问各种会话范围的托管bean.建议(如看到这里)是这样做的过滤器:
HttpSession session = request.getSession(false);
User user = (session != null) ? (User) session.getAttribute("user") : null;
Run Code Online (Sandbox Code Playgroud)
据推测,这会获取User类的会话bean .问题是这不起作用.
出了什么问题,bean在会话属性中存在,但它们由Weld工具包装.我写了doFilter()方法如下:
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);
}
Run Code Online (Sandbox Code Playgroud)
当这会转储会话属性时,我通常得到这样的东西:
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
Run Code Online (Sandbox Code Playgroud)
属性#2似乎代表了我想要的bean.不用说对session.getAttribute("login")的调用不起作用.
谁能说如何访问底层托管bean?我宁愿以一种与Weld无关的方式来做,但这可能是不可能的.
Bal*_*usC 16
此方法@ManagedBean仅适用于会话范围的JSF ,不适用于CDI @Namedbean.
您需要将@Inject其作为过滤器的属性.
@Inject
private User user;
Run Code Online (Sandbox Code Playgroud)
小智 5
import org.jboss.weld.context.SerializableContextualInstanceImpl;
HttpSession httpSession = (HttpSession) facesContext.getExternalContext().getSession(false);
Enumeration<String> attribs = httpSession.getAttributeNames();
String attrib = null;
while (attribs.hasMoreElements()) {
attrib = attribs.nextElement();
Object obj = httpSession.getAttribute(attrib);
if(obj instanceof SerializableContextualInstanceImpl){
SerializableContextualInstanceImpl impl = (SerializableContextualInstanceImpl)obj;
//here: MyObject myObj= (MyObject)impl.getInstance();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10202 次 |
| 最近记录: |