CDI拦截器不与servlet中的当前请求同时发生

时间:2017-11-02 08:28:49

标签: servlets java-ee cdi

对不起标题,我不知道如何获得更好的头衔。

我创建了一个简单的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

1 个答案:

答案 0 :(得分:0)

创建拦截器时,会在调用方法之前或之后调用它。通过编写自己的方式,可以在调用方法之前调用它。 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;
    }
}