Grails:有没有办法在视图完全渲染后运行过滤器?
我有一个当前定义为在渲染视图后运行的过滤器:Grails:有没有办法在视图完全渲染后运行过滤器?,grails,Grails,我有一个当前定义为在渲染视图后运行的过滤器: class MyFilter { def filters = { doStuff(controller: '*', action: '*') { before = {...} after = {...} afterView = { // code I want to run when EVERYTHING is set and done } Holder.setCur
class MyFilter {
def filters = {
doStuff(controller: '*', action: '*') {
before = {...}
after = {...}
afterView = {
// code I want to run when EVERYTHING is set and done }
Holder.setCurrentData(null)
}
}
}
这应该是可行的,但我注意到
标记(可能还有其他标记;这就是我现在感兴趣的标记)是在afterView
过滤器之后执行的
这是一个问题,因为我使用此筛选器跟踪ThreadLocal中当前执行的一些信息,并且我希望确保在请求完成后自己进行清理。我不想使用request/session对象来洗牌数据,因为这样我就必须将它传递给我所做的所有调用;实际上,我有一个Holder类,可以在ThreadLocal中查询该值
我需要自定义MessageSource中来自ThreadLocal的信息。这就是我如何注意到
在后视图
过滤器之后被调用的原因。您可以使用servlet过滤器:
package com.mycompany
import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.springframework.web.filter.GenericFilterBean;
public class MyFilter extends GenericFilterBean {
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
try {
chain.doFilter(req, res);
}
finally {
Holder.setCurrentData(null);
}
}
}
如果您还没有安装grails install templates,请运行grails install templates
,然后可以在src/templates/war/web.xml中注册它,如下所示:
<filter>
<filter-name>myFilter</filter-name>
<filter-class>com.mycompany.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
我的过滤器
com.mycompany.MyFilter
我的过滤器
/*
为了方便起见,我扩展了
GenericFilterBean
,但是您也可以直接实现javax.servlet.Filter
接口。它也可以用Groovy编写,但我倾向于用Java编写过滤器,因为每个请求都会调用它们,Groovy添加的小开销可以加在一起。这个解决方案工作正常。我很失望Grails没有更好的方法来处理这个问题;这感觉就像是“自己滚”。您知道为什么视图完全呈现后,afterView
过滤器不会运行吗?Grails过滤器包装SpringHandlerInterceptor
s,因此它们仅限于拦截控制器请求,而不是静态资源请求,并且只具有与HandlerInterceptor
相同的回调。谢谢。这就解释了。