groovy grails_在Grails战争中添加一个“精简”的Groovy Web控制台
groovy grails
假設(shè)您已將Grails應(yīng)用程序部署到服務(wù)器上–如何查找應(yīng)用程序的配置方式? 如果您有來(lái)源,則可以查看Config.groovy , BuildConfig.groovy等(在這種情況下,我正在談?wù)揋rails 2應(yīng)用程序,但是這些想法可以推廣到Grails 3+),但這通常還不夠。
Grails 2支持外部配置文件,該文件可以在不同的地方并合并到最終配置中。 但是僅僅擁有您認(rèn)為正確的源文件和配置文件是不夠的,因?yàn)榭赡芤呀?jīng)進(jìn)行了一些更改,而這些更改并未納入源代碼管理中。 而且,由于它們已被編譯為類(lèi),因此您無(wú)法輕易地從WAR中的這些文件中獲取信息。
我更喜歡挖掘正在運(yùn)行的Grails應(yīng)用程序是控制臺(tái)插件,但要使用該插件,您需要將其添加到BuildConfig.groovy并構(gòu)建和部署新的WAR,但這又不一定與先前的配置相同。部署。
我在工作時(shí)遇到這種情況,因此我想出了一種輕巧的方法,可以將類(lèi)似于控制臺(tái)插件的基于Web的控制臺(tái)添加到WAR中。 最初,它是一個(gè)servlet,它以簡(jiǎn)單的形式生成HTML,其中包含用于Groovy代碼的文本區(qū)域和用于提交要在服務(wù)器上運(yùn)行的代碼的提交按鈕,以及用于執(zhí)行代碼和返回結(jié)果到瀏覽器。 我在構(gòu)建WAR的同一項(xiàng)目中對(duì)其進(jìn)行了編譯,以確保它與Groovy,Grails,Spring等版本兼容,然后將.class文件復(fù)制到Tomcat的webapps文件夾的展開(kāi)目錄中的WEB-INF/classes中。 ,并手動(dòng)編輯WEB-APP/web.xml以添加所需的<servlet>和<servlet-mapping>元素,并且一切在我的小型測(cè)試應(yīng)用程序中都很好用。
但是當(dāng)我在真實(shí)的應(yīng)用程序中嘗試它時(shí),由于Spring Security的緣故,我無(wú)法訪問(wèn)它。 在這種特殊情況下,我可以解決該問(wèn)題,因?yàn)樵搼?yīng)用程序?qū)equestmap實(shí)例存儲(chǔ)在數(shù)據(jù)庫(kù)中,但我不想進(jìn)行可能忘記撤消的更改,并且存在雞與蛋的問(wèn)題必須知道此部署的數(shù)據(jù)庫(kù)設(shè)置是什么。 因此,我改為將servlet轉(zhuǎn)換為servlet過(guò)濾器,并確保將過(guò)濾器添加到web.xml的Spring Security過(guò)濾器鏈之前,并在重新啟動(dòng)服務(wù)器后按預(yù)期工作。
我在爆炸的war目錄中進(jìn)行了更改,但是也可以在WAR文件本身中進(jìn)行更改。 由于WAR文件是ZIP文件,因此您可以解壓縮WAR,進(jìn)行更改并重新壓縮。
這是過(guò)濾器的來(lái)源:
package com.burtbeckwith.hackimport groovy.transform.CompileStatic import groovy.util.logging.Slf4j import org.codehaus.groovy.grails.commons.GrailsApplication import org.springframework.context.ApplicationContext import org.springframework.web.context.support.WebApplicationContextUtilsimport 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.HttpServletRequest import javax.servlet.http.HttpServletResponse@CompileStatic @Slf4j class HackFilter implements Filter {private ApplicationContext applicationContextprivate GrailsApplication grailsApplicationvoid init(FilterConfig fc) throws ServletException {applicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(fc.servletContext)grailsApplication = applicationContext.getBean(GrailsApplication)}void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) reqHttpServletResponse response = (HttpServletResponse) resif ('GET' == request.method) {doGet request, response}else {// assume POSTdoPost request, response}}void destroy() {}private void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.writer.write html(request.contextPath)}private void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {long startTime = System.currentTimeMillis()String code = request.getParameter('code')ByteArrayOutputStream baos = new ByteArrayOutputStream()PrintStream out = new PrintStream(baos)PrintStream systemOut = System.outThrowable eString result = ''try {System.out = outresult = new GroovyShell(grailsApplication.classLoader, new Binding(config: grailsApplication.config,ctx: applicationContext,grailsApplication: grailsApplication,out: out,request: request,session: request.session)).evaluate(code)}catch (Throwable t) {e = t}finally {System.out = systemOut}if (e) {StringWriter sw = new StringWriter()e.printStackTrace new PrintWriter(sw)result = sw.toString().replace('\t', ' ').replace(System.getProperty('line.separator'), '<br/>\n')}response.writer << html(request.contextPath, code, """\ Total time: ${System.currentTimeMillis() - startTime}msStdout: ${baos.toString('UTF8')}${e ? 'Exception' : 'Result'}: $result""")}private String html(String contextPath, String code = '', String results = '') {"""\ <html> <head> <title>Hack</title> </head> <body><form action="$contextPath/hack" method="POST"><span>Code: (binding vars include <i>config</i>, <i>ctx</i>, <i>grailsApplication</i>, <i>out</i>, <i>request</i>, <i>session</i>)</span><br/><textarea name="code" cols="120" rows="25">$code</textarea><br/><input type="submit" value="Execute" name="execute" /><br/><span>Results:</span><br/><textarea name="results" cols="120" rows="25" disabled="disabled">$results</textarea></form> </body> </html> """} }這些是web.xml的相應(yīng)<filter>和<filter-mapping>元素:
<filter><filter-name>hack</filter-name><filter-class>com.burtbeckwith.hack.HackFilter</filter-class> </filter> <filter-mapping><filter-name>hack</filter-name><url-pattern>/hack</url-pattern> </filter-mapping>要訪問(wèn)控制臺(tái),請(qǐng)導(dǎo)航至http:// server:port / contextPath / hack。 與在控制臺(tái)插件中一樣,您可以運(yùn)行任意的Groovy代碼(包括服務(wù)方法調(diào)用,使用域類(lèi)等),并且在綁定中可以使用多個(gè)對(duì)象– config , ctx , grailsApplication , out , request和session 。
要將uri從/ hack更改為其他內(nèi)容,請(qǐng)確保同時(shí)更新web.xml的<url-pattern>標(biāo)簽和過(guò)濾器類(lèi)中生成的表單中的action屬性。
假設(shè)您已將Grails應(yīng)用程序部署到服務(wù)器上–如何查找應(yīng)用程序的配置方式? 如果您有資源,那么您……
此條目發(fā)布于2017年12月7日星期四上午8:23,并根據(jù)grails , groovy , java , security提交。 您可以通過(guò)RSS 2.0 feed跟蹤對(duì)此條目的任何響應(yīng)。 您可以在自己的網(wǎng)站上留下回應(yīng) (審核審核)或引用 。
翻譯自: https://www.javacodegeeks.com/2017/12/adding-lite-groovy-web-console-grails-war.html
groovy grails
總結(jié)
以上是生活随笔為你收集整理的groovy grails_在Grails战争中添加一个“精简”的Groovy Web控制台的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 桑夏太阳能怎么设置(桑夏太阳能怎么设置时
- 下一篇: 电脑内存超频条件多少(内存可以超频多少)