我的拦截器(验证)在操作之前或之后没有被调用。有什么想法如何让它发挥作用吗?
注意:每次调用默认拦截器时。
<?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/