java - Struts 中拦截器没有被调用

标签 java struts2 interceptor struts2-interceptors interceptorstack

我的拦截器(验证)在操作之前或之后没有被调用。有什么想法如何让它发挥作用吗?

注意:每次调用默认拦截器时。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
  <package name="default" namespace="/" extends="struts-default,json-default">
    <result-types>
      <result-type name="tiles" class="org.apache.struts2.views.tiles.TilesResult" />
      <result-type name="json" class="org.apache.struts2.json.JSONResult" />
    </result-types>

    <interceptors>
       <interceptor name="validation" class="ValidatorBaseAction"/>
      <interceptor-stack name="default">
        <interceptor-ref name="logger"/>
      </interceptor-stack>
      <interceptor-stack name="validationStack">
         <interceptor-ref name="validation"/>
         <interceptor-ref name="default"/>
      </interceptor-stack>
    </interceptors>

    <default-interceptor-ref name="default" />

    <action
        name="viewRequest"
        class="ViewAction"
        method="execute">
      <interceptor-ref name="validationStack" /> 
      <result name="input" type="redirectAction">explore</result>
      <result name="success" type="redirect">/showRequest.do?${explorerParameters}</result>
    </action>
  </package>
</struts>

最佳答案

主要问题:

  • class操作和拦截器都必须指定FQCN,而不仅仅是名称。然后将其更改为:

    <interceptor name="validation" class="com.foo.bar.ValidatorBaseAction"/>
    

    并将您的操作更改为

    <action name="viewRequest" class="com.foo.bar.ViewAction" method="execute">
    

附带问题:

  • 别叫它ValidatorBaseAction如果是Interceptor ,称之为ValidatorBaseInterceptor 。并确保其中没有任何操作
  • 不要使用拦截器堆栈只有一个拦截器,我很确定它在 99% 的情况下都是无用的。如果您不确定,只需使用defaultStack,将您的拦截器添加到其中即可。

抛光:

  • json-default 已经延长struts-default ,所以这个

    <package ... extends="struts-default,json-default"
    

    相当于这个

    <package ... extends="json-default"
    

    这样更干净;

  • 由于扩展了 json-default,因此不需要重新定义 JSON 结果,然后删除

    <result-type name="json" class="org.apache.struts2.json.JSONResult" />
    

    那是没用的。

  • 尽量选择 redirectAction重定向到操作时的结果,并使用 redirect仅当重定向到其他资源或外部 URL 时才会出现结果

关于java - Struts 中拦截器没有被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30043007/

相关文章:

java - 线程安全与同步

java - Weak/Soft/Phantom Reference清算的并发保证

java - RabbitMQ 中的 "Consumer utilisation"是什么,它与预取计数有何关系?

java - SEAM:有效使用@BypassInterceptors?

java webstart 没有缓存

java - 如何验证动态 map 元素

java - 嵌入在 URL 中的 Struts2 Action

struts2 - 禁用 Struts 操作调用

authentication - Grails 3.0.x 拦截器 matchAll().excludes 用于多个 Controller

Android 应用程序崩溃 okhttp3 HTTP FAILED : javax.net.ssl.SSLException : Read error: I/O error during system call, 软件导致连接中止