【问题标题】:Redirect in Interceptor when not logged未记录时在拦截器中重定向
【发布时间】:2013-03-11 09:55:03
【问题描述】:

我试图在我的拦截器中使用@aroundInvoke,检查一些validationX以继续执行该方法,否则将用户重定向到特定的JSF页面。

@AroundInvoke
public Object myInterceptor(InvocationContext invocation) throws Exception {
        if(validationX){//it passes the validation so proceed
            return invocation.proceed();    
        }else{//it doesnt passes the validation so go to 
            //DO SOMETHING TO REDIRECT TO SPECIFIC JSF
        }

    }

我试过了:

  • 使用“JSF?faces-redirect=true”返回字符串 ----- 我得到转换错误(字符串到方法应返回的任何内容)。
  • FacesContext.getCurrentInstance().getExternalContext().dispatch("/JSF.jsf"); ----- 我使用 getCurrentInstance 方法得到 nullPointerException。
  • FacesContext.getCurrentInstance().getExternalContext().redirect("/JSF.jsf"); --------同样的NullPointerException。
    • 使用 HttpServletRequest 和 HttpServletResponse 生成响应,但出现 NullPointer 异常。

提前致谢!

【问题讨论】:

    标签: jakarta-ee jsf-2 ejb interceptor


    【解决方案1】:

    Java EE 拦截器不是为此而设计的。它旨在用于决定是否继续调用当前 CDI/EJB bean 方法(并在必要时抛出异常以中止它),和/或控制/操作其返回值。它不打算充当 JSF 控制器。为此,应该使用普通的 JSF 托管 bean。

    或者,如果这涉及异常情况,那么您应该只抛出一个特定的异常,并在 web.xml 中注册一个 <error-page> 就在该异常类型上。如果您可以挂钩特定的 URL 而不是特定的方法调用,另一种方法是在一个简单的 servlet filter 中执行这项工作。

    由于您incorrectly 认为这将是正确的解决方案的具体功能要求从问题中不清楚,因此无法给出更详细的答案。

    【讨论】:

    • 该解决方案旨在保护某些 EJB 的某些方法,servlet 过滤器已经启动并运行保护正在使用的地毯和 url。保护方法被调用的唯一方法是这样,等待另一个答案;如果没有,我会为你竖起大拇指。
    • 抛出一个特定的运行时异常并为此配置一个<error-page>
    • 尝试该解决方案我遇到了另一个并发症;这当然是正确的答案,但我的自定义异常被 EJBException 或 ServletException 包围,有什么想法可以将它作为独立的抛出以在错误页面中捕获?
    • ServletException 不是问题。容器隐式地打开它。 EJBException 可以使用带有try-catch 的 servlet 过滤器展开并重新抛出为 new ServletException(e.getCause()),在 EJBException 周围 FilterChain#doFilter() 调用。
    • 好吧,毕竟谢谢你的帮助,就像你最后建议的那样做我的自定义异常。再次感谢!
    猜你喜欢
    • 2014-12-23
    • 2014-05-24
    • 2015-08-22
    • 1970-01-01
    • 1970-01-01
    • 2020-07-26
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多