![](/img/trans.png)
[英]@ManagedProperty - Inject one request scoped bean into another request scoped bean
[英]Inject request scoped bean in servlet filter
是否可以在 servlet 過濾器中注入(CDI)請求范圍的 bean?
我的login.xhtml
如下 -
<h:form>
<h:inputText id="uname" value="#{login.uname}" />
<h:inputSecret id="pwd" value="#{login.upwd}" />
<h:commandButton action="#{loginc.login}" value="Login" />
</h:form>
在此頁面上的POST
中,我的 servlet 過濾器中需要Login
bean,但它始終是null
。 我的后盾
@Named("login")
@RequestScoped
public class Login {
private String uname;//with getters and setters
private String upwd;
}
以下是我將其注入過濾器的方式 -
public class LoginFilter implements Filter {
@Inject
private Login login;
...
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
//System.out.println(((Login)request.getAttribute("login")).toString()); **Not Working**
System.out.println("login ->" + login);//not working
}
現在從某種意義上說,容器注入了一個引用,但所有字段都是空的。 我期待發布的表單數據值,即支持 bean 中提到的屬性的值。
如果不可能,那么還有其他方法嗎? 目的是避免使用其他類型的作用域 bean 創建 session。
更新-
我按照評論部分的建議進行了一些更改,但問題 bean 的值仍然是null
public class LoginFilter implements Filter {
@Inject
private BeanManager beanManager;
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
findBean("login", req);
chain.doFilter(req, res);
}
public void findBean(String beanName, ServletRequest req){
FacesContext facesContext = FacesContext.getCurrentInstance();
System.out.println(facesContext == null);//always true
System.out.println(beanManager==null);//is not null
Bean bean = beanManager.getBeans(beanName).iterator().next();
CreationalContext ctx = beanManager.createCreationalContext(bean);
Login loginBean = (Login) beanManager.getReference(bean, bean.getBeanClass(),ctx);
System.out.println(loginBean);//prints null as value for properties for post request also.
}
我想做什么- 我有一個Login
請求和LoginController
視圖范圍的 bean。 這就是我最初的開始方式。 因此,對於用戶名和密碼Login
和loginController.login
登錄操作。 這按預期工作。 我將Login
注入LoginController
所有字段/s 值都在那里。
我的要求是管理用戶會話並實現記住我的功能。 所以,為了做到這一點,我首先在loginController
中創建 cookie/s 並且它起作用了。
在這里,通過上述設置 - 首先我想避免不必要的 session 創建。 我希望請求登陸登錄頁面,但沒有 session。 這一要求是所有這些過濾器和相關返工背后的驅動力。 我求助於<c:view transient="true">
。 這我不確定,工作與否。 現在,在您的一個答案中,您寫道we should not put cookie and other authorization and authentication
相關的東西放在支持 bean 中。
所以,我對自己說 - 好吧,我沒有在我的代碼中遵循良好的做法,為什么不編寫一個過濾器,如果我可以在那里攔截Login
bean,我應該能夠在那里執行我的身份驗證/授權和 cookie 相關的東西本身。 這樣,我可以避免點擊view scoped loginController
並且沒有不需要的 session。 我可以通過編程方式控制 session。 這從來沒有奏效,所以這就是我問這個問題的原因。
在您的一個答案中,您寫道 - session creation is cheap
- 但我仍然想在訪問我的應用程序的login page
時避免它。
現在,我終於完成和工作的是 - 我的登錄表單使用普通的 html 輸入字段,然后在登錄操作中我以舊的 servlet 方式截取這些字段值。 對於有效的嘗試 - 我以programmatically
方式創建 session 並重定向。
請讓我知道我是否可以改進。
嘗試使用 Spring 攔截器而不是過濾器。 你可以在這里找到的例子
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.