簡體   English   中英

在 servlet 過濾器中注入請求范圍的 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。 這就是我最初的開始方式。 因此,對於用戶名和密碼LoginloginController.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM