在Grails战争中添加“精简” Groovy Web控制台
假設(shè)您已將Grails應(yīng)用程序部署到服務(wù)器上–如何查找應(yīng)用程序的配置方式? 如果您有來源,則可以查看Config.groovy , BuildConfig.groovy等(在這種情況下,我正在談?wù)揋rails 2應(yīng)用程序,但是這些想法可以推廣到Grails 3+),但這通常還不夠。
Grails 2支持外部配置文件,該文件可以在不同的地方并合并到最終配置中。 但是僅僅擁有您認為正確的源文件和配置文件是不夠的,因為可能已經(jīng)進行了一些更改,而這些更改并未納入源代碼管理中。 而且,由于它們已被編譯為類,因此您無法輕易地從WAR中的這些文件中獲取信息。
我更喜歡挖掘正在運行的Grails應(yīng)用程序是控制臺插件,但要使用該插件,您需要將其添加到BuildConfig.groovy并構(gòu)建和部署新的WAR,但這又不一定與先前的配置相同。部署。
我在工作時遇到這種情況,因此我想出了一種輕巧的方法,可以將類似于控制臺插件的基于Web的控制臺添加到WAR中。 最初,它是一個servlet,它以一種簡單的形式生成HTML,其中包含用于Groovy代碼的文本區(qū)域和用于提交要在服務(wù)器上運行的代碼的提交按鈕,以及用于執(zhí)行該代碼的邏輯(主要是從控制臺插件借來的)返回結(jié)果到瀏覽器。 我在構(gòu)建WAR的同一項目中對其進行了編譯,以確保它與Groovy,Grails,Spring等版本兼容,然后將.class文件復(fù)制到Tomcat的webapps文件夾的展開目錄中的WEB-INF/classes中。 ,并手動編輯WEB-APP/web.xml以添加所需的<servlet>和<servlet-mapping>元素,并且在我的小型測試應(yīng)用程序中一切正常。
但是當(dāng)我在真實的應(yīng)用程序中嘗試它時,由于Spring Security的緣故,我無法訪問它。 在這種特殊情況下,我可以解決該問題,因為該應(yīng)用程序?qū)equestmap實例存儲在數(shù)據(jù)庫中,但是我不想進行可能忘記撤消的更改,并且存在雞與蛋的問題必須知道此部署的數(shù)據(jù)庫設(shè)置是什么。 因此,我改為將servlet轉(zhuǎn)換為servlet過濾器,并確保將過濾器添加到web.xml的Spring Security過濾器鏈之前,并在重新啟動服務(wù)器后按預(yù)期工作。
我在爆炸的war目錄中進行了更改,但是也可以在WAR文件本身中進行更改。 由于WAR文件是ZIP文件,因此您可以解壓縮WAR,進行更改并重新壓縮。
這是過濾器的來源:
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>要訪問控制臺,請導(dǎo)航至http:// server:port / contextPath / hack。 與在控制臺插件中一樣,您可以運行任意Groovy代碼(包括服務(wù)方法調(diào)用,使用域類等),并且在綁定中可以使用多個對象– config , ctx , grailsApplication , out , request和session 。
要將uri從/ hack更改為其他內(nèi)容,請確保同時更新web.xml的<url-pattern>標(biāo)簽和過濾器類中生成的表單中的action屬性。
假設(shè)您已將Grails應(yīng)用程序部署到服務(wù)器上–如何查找應(yīng)用程序的配置方式? 如果您有資料來源,那么您……
此條目發(fā)布于2017年12月7日星期四上午8:23,并根據(jù)grails , groovy , java , security提交。 您可以通過RSS 2.0 feed跟蹤對此條目的任何響應(yīng)。 您可以在自己的網(wǎng)站上留下回復(fù) (審核審核)或引用 。
翻譯自: https://www.javacodegeeks.com/2017/12/adding-lite-groovy-web-console-grails-war.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的在Grails战争中添加“精简” Groovy Web控制台的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 猩猩助手安卓模拟器下载(猩猩助手安卓模拟
- 下一篇: ubuntu生成密钥和证书_基于浏览器的