Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Grails:有没有办法在视图完全渲染后运行过滤器?_Grails - Fatal编程技术网

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过滤器包装Spring
HandlerInterceptor
s,因此它们仅限于拦截控制器请求,而不是静态资源请求,并且只具有与
HandlerInterceptor
相同的回调。谢谢。这就解释了。