簡體   English   中英

CDI攔截器與Servlet中的當前請求不同

[英]CDI Interceptor not simultaneous to current request in servlet

對不起,標題,我不知道要獲得更好的標題。

我創建了一個簡單的servlet並實現了CDI攔截器。

這是我的servlet

@Inject
UserManagement user;

protected void doGet(HttpServletRequest request, HttpServletResponse response) {
    user.setUsername(request.getParameter("username"));
    response.getWriter().println(user.getMessage());
}

這是UserManagement bean:

@SessionScoped
public class UserManagement implements Serializable{

    private String username;
    private String message = "";

    @UsernameSet
    public void setUsername(String username){
        this.username = username;
    }
}

這是攔截器綁定(@UsernameSet):

@InterceptorBinding
@Inherited
@Target({ TYPE, METHOD })
@Retention(RUNTIME)
@Documented
public @interface UsernameSet {
}

這是攔截器:

@UsernameSet
@Interceptor
public class UserInterceptor implements Serializable {

    @Inject
    UserManagement user;

    @AroundInvoke
    public Object aroundInvoke(InvocationContext ic) throws Exception {
        LOGGER.info("Entering method: " + ic.getMethod().getName());
        user.setMessage("Hello " + user.getUsername());
        return ic.proceed();
    }
}

攔截器確實可以工作,但是servlet從先前的請求中返回了UserManagement bean,盡管記錄器立即顯示了該消息。

第一個請求: localhost?username=smitty

瀏覽器屏幕: Hello

第二個請求: localhost?username=werben

瀏覽器屏幕: Hello smitty

第三個請求: localhost?username=jensen

瀏覽器屏幕: Hello werben

創建攔截器時,它會在調用方法之前或之后被調用。 使用您編寫方法的方式,將在調用您的方法之前調用它。 InvocationContext.proceed將有效地調用您的方法(和其他攔截器(如果連接了其他攔截器))。

要獲得所需的行為,可以切換到以下方式:

@UsernameSet
@Interceptor
public class UserInterceptor implements Serializable {

    @Inject
    UserManagement user;

    @AroundInvoke
    public Object aroundInvoke(InvocationContext ic) throws Exception {
        LOGGER.info("Entering method: " + ic.getMethod().getName());
        Object result = ic.proceed();
        user.setMessage("Hello " + user.getUsername());
        return result;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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