对不起标题,我不知道如何获得更好的头衔。
我创建了一个简单的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
答案 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;
}
}