【问题标题】:Grails 3 - manipulating web.xmlGrails 3 - 操作 web.xml
【发布时间】:2015-04-10 10:14:10
【问题描述】:

由于现在 web.xml 将动态生成,我需要在其顶部添加一个简单的过滤器类,而无需编写或使用插件。 我需要什么代码,我应该把它放在哪里?

或者我能否以某种方式获得 grails 将为 web.xml 生成的模板,然后我可以修改和覆盖它?

我在文档中看到

grails.war.resources = { stagingDir, args ->
    copy(file: "grails-app/conf/custom-web.xml",
         tofile: "${stagingDir}/WEB-INF/web.xml")
}

但首先:这个函数会在 application.yml 中起作用吗?

第二个:我仍然需要一个合适的 web.xml 模板来更改...

谢谢!

【问题讨论】:

    标签: grails web.xml grails-3.0


    【解决方案1】:

    根据 cfrick 的建议,我尝试了这个,(适用于 grails 3)

    创建一个过滤器,例如[grails-project]/src/main/java/hello/SimpleCORSFilter.java (创建'java'目录,或者在[grails-project/src/main/groovy目录下创建一个SimpleCORSFilter.groovy)

    您可以使用one of the spring guides中的示例。

    package hello;
    
    import java.io.IOException;
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletResponse;
    import org.springframework.stereotype.Component;
    
    @Component
    public class SimpleCORSFilter implements Filter {
    
        public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
            HttpServletResponse response = (HttpServletResponse) res;
            response.setHeader("Access-Control-Allow-Origin", "*");
            response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
            response.setHeader("Access-Control-Max-Age", "3600");
    //        response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
            // I used this instead
            response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
            chain.doFilter(req, res);
    }
    
        public void init(FilterConfig filterConfig) {}
    
        public void destroy() {}
    
    }
    

    然后在[grails-project]/grails-app/conf/spring/resources.groovy中添加过滤器,例如

    import hello.SimpleCORSFilter
    
    // Place your Spring DSL code here
    beans = {
        myFilter(SimpleCORSFilter)
    }
    

    另外,在 grails 文档中,订购您的过滤器:

    import hello.SimpleCORSFilter
    import org.springframework.boot.context.embedded.FilterRegistrationBean
    import org.springframework.core.Ordered
    
    myFilter(FilterRegistrationBean) {
        filter = bean(SimpleCORSFilter)
        urlPatterns = ['/*']
        order = Ordered.HIGHEST_PRECEDENCE
    }
    

    【讨论】:

    【解决方案2】:

    我知道这不是实际问题的答案,但添加过滤器“springboot”样式只是为其提供@Bean。例如。你可以把它放在grails-app/conf/spring/resources.groovy。更多详情请见:How to add a filter class in Spring Boot?

    Grails 3 拥抱 Springboot 并随之告别基于 XML 的配置(不是说它被禁止,而是不鼓励)

    【讨论】:

      【解决方案3】:

      您可以使用 install-templates 命令,将模板复制到 src/templates 目录,在那里您会在 war 目录中找到 web.xml 模板,您可以自定义它

      http://www.grails.org/doc/latest/ref/Command%20Line/install-templates.html

      【讨论】:

      • 谢谢,但 Grails 3 中不再有“安装模板”了
      • Grails 3 ?哪个确切版本,grails 2.4.4 有它
      • 3.0.0.M1,下一个版本将进行一些重大更改。这就是为什么值得提前开始;)
      • 哦,它只是预览,不知道你怎么能用 3.0 覆盖 web xml
      • 不是我!!??也不是我赞成我自己的问题!!???我可以点击一次 false ......但不能点击两次......我希望 :-/
      猜你喜欢
      • 2016-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多