【问题标题】:CDI Interceptor not simultaneous to current request in servletCDI 拦截器与 servlet 中的当前请求不同时
【发布时间】:2017-11-02 08:28:48
【问题描述】:

抱歉标题,我不知道如何获得更好的标题。

我创建了一个简单的 servlet 并实现了 CDI 拦截器。

这是我的小服务程序

@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

【问题讨论】:

    标签: servlets jakarta-ee cdi


    【解决方案1】:

    当你创建一个拦截器时,它会在你的方法被调用之前或之后被调用。使用您编写的方式,在调用您的方法之前调用它。 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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-03-10
      • 1970-01-01
      • 2020-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多