当前位置: 首页 > 面试题库 >

在拦截器中获取结果类型

松雅健
2023-03-14
问题内容

我有带有不同(HTML和JSON)结果类型的Struts2操作。他们使用通用拦截器。

如果需要拦截请求,如何根据给定的操作结果类型返回结果?

例如,我Action.ERROR转发到JSP页面。如果操作是JSON类型,我想转发JSON错误。


问题答案:

我有带有不同(HTML和JSON)结果类型的Struts2操作。他们使用通用拦截器。如果需要拦截请求,如何根据给定的动作结果类型返回结果?

例如,我的Action.ERROR转发到JSP页面。如果操作是JSON类型,我想转发JSON错误。请指教。

尽管确实没有 类型 ,但如果以AJAX方式调用Action,例如返回JSON的Action,则其所有结果 都应
具有相同的结果类型(在这种情况下为JSON),这也是事实。您正在使用单个操作来执行不同的逻辑操作(ajax和non-ajax操作,这是一种反模式);

就是说,如果您想从所有Action(每个都有其结果类型的Action)使用的Interceptor内部返回正确的 GLOBAL错误结果
,则基于它们的 _ 其他 结果类型( SUCCESS_ 假设:,假设每个Action都有一个SUCCESS结果),这是做它的方式:

public String intercept(ActionInvocation invocation) throws Exception {

    // Get the action configuration defined in struts.xml
    ActionConfig config = invocation.getProxy().getConfig();

    // Get the SUCCESS result configured for that Action
    ResultConfig success = config.getResults().get("success");

    // Get the class of the SUCCESS result
    Object clazz = success.getClass();

    /* .... oops, some error occurred !! 
       We now need to redirect to the right global error result .... */

    if (clazz instanceof org.apache.struts2.dispatcher.ServletDispatcherResult) {
        log.debug("Struts2 Result type: CLASSIC");
        return "error";
    } else if (clazz instanceof org.apache.struts2.json.JSONResult) {
        log.debug("Struts2 Result type: JSON");
        return "jsonError";
    } else {
        log.debug("Struts2 Result type: SOMETHING ELSE, returning default ");
        return "error";
    }
}

尽管从技术上讲这是可行的,但我不鼓励这样做,因为……没有真正的理由这样做。

为了您的目的,请记住 每个 全局结果 都在其范围内 <package>

因为您可以(/应该)为Classic Actions(<package>扩展名struts-default)和JSON
Actions(<package>扩展名)具有两个不同的包json-default,所以您可以 为每个具有相同名称但结果类型不同的包 简单地
定义两个不同的全局错误结果 ;这样,拦截器将相对于当前Action的程序调用一个,从而输出所需的结果。



 类似资料:
  • 问题内容: 我有以下动作映射 我可以使用Interceptor中的以下行获取参数映射 就像上面一样, 有什么方法可以获取 以下映射中定义的 拦截器参数 。 动作参数按以下方式定义,动作参数和拦截器参数应分别可访问。 请注意,我不想在拦截器中将参数字段声明为 在Dev Blanked的攻击之后,我实现了他的技术。它没有用,所以我在这里共享我的代码。我正在使用Struts 2.3.1.2。 图书馆 a

  • 我试图在javascript中为fetch创建一个拦截器(更具体地说是React)。它应该从每次调用的fetch中获取结果,如果是401错误,它应该向另一个路由发起新的fetch调用,以获取cookie(刷新令牌)。然后,应该再次尝试原始的fetch调用(因为现在用户已经登录)。 我已经成功地触发了新的fetch调用,并为每个调用发回了cookie,但我遇到了以下两个问题: 我似乎在使用async

  • 问题内容: 如何在Hibernate拦截器中获取Hibernate会话? 我正在尝试使用Hibernate通过组织ID透明地强制执行数据访问。我设置了一个全局筛选器,以按组织ID筛选所有查询。现在,在保存/更新之前,我需要使用实体拦截器在所有实体上设置组织ID。 组织ID来自HttpSession 我已经在Hibernate会话中将Organizational Id设置为Filter属性,我想在我

  • 我有一个OkHttp拦截器,当请求得到401 HTTP错误时,它应该请求一个令牌。现在,登录服务的请求完成了,但随后链路中断,原始请求不再重试。下面是我的拦截器的拦截方法: reLogin()方法是: 新:正如Mitesh Machhoya所说,我尝试了两个不同的改型实例,一个带有拦截器的okhttp客户端,另一个没有。现在登录调用没有被拦截,但是拦截器的执行被中断了,我的意思是这个类的日志跟踪是

  • 问题内容: 我尝试了一些来自hibernate 4.0拦截器的 代码,该代码为使用会话级拦截器提供了以下代码: 但是,我同时检查了hibernate-core 4.0源代码和onliehibernate 4.0 java- doc ,该类没有方法,但是hibernate 3.6 java- doc确实具有此方法。 有人知道该方法移到哪里吗?如果已弃用,为什么文档仍将其保留在教程文档中?在4.0中如

  • easyopen在1.3.1版本开始支持拦截器。 easyopen拦截器实现原理跟springmvc拦截器类似,拦截器作用在api方法上,即有@Api注解的方法。 拦截器定义如下: /** * 拦截器,原理同springmvc拦截器 * @author tanghc * */ public interface ApiInterceptor { /** * 预处理回调方法,