日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

groovy grails_在Grails战争中添加一个“精简”的Groovy Web控制台

發(fā)布時(shí)間:2023/12/3 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 groovy grails_在Grails战争中添加一个“精简”的Groovy Web控制台 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。