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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

在Grails战争中添加“精简” Groovy Web控制台

發布時間:2023/12/3 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在Grails战争中添加“精简” Groovy Web控制台 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

假設您已將Grails應用程序部署到服務器上–如何查找應用程序的配置方式? 如果您有來源,則可以查看Config.groovy , BuildConfig.groovy等(在這種情況下,我正在談論Grails 2應用程序,但是這些想法可以推廣到Grails 3+),但這通常還不夠。

Grails 2支持外部配置文件,該文件可以在不同的地方并合并到最終配置中。 但是僅僅擁有您認為正確的源文件和配置文件是不夠的,因為可能已經進行了一些更改,而這些更改并未納入源代碼管理中。 而且,由于它們已被編譯為類,因此您無法輕易地從WAR中的這些文件中獲取信息。

我更喜歡挖掘正在運行的Grails應用程序是控制臺插件,但要使用該插件,您需要將其添加到BuildConfig.groovy并構建和部署新的WAR,但這又不一定與先前的配置相同。部署。

我在工作時遇到這種情況,因此我想出了一種輕巧的方法,可以將類似于控制臺插件的基于Web的控制臺添加到WAR中。 最初,它是一個servlet,它以一種簡單的形式生成HTML,其中包含用于Groovy代碼的文本區域和用于提交要在服務器上運行的代碼的提交按鈕,以及用于執行該代碼的邏輯(主要是從控制臺插件借來的)返回結果到瀏覽器。 我在構建WAR的同一項目中對其進行了編譯,以確保它與Groovy,Grails,Spring等版本兼容,然后將.class文件復制到Tomcat的webapps文件夾的展開目錄中的WEB-INF/classes中。 ,并手動編輯WEB-APP/web.xml以添加所需的<servlet>和<servlet-mapping>元素,并且在我的小型測試應用程序中一切正常。

但是當我在真實的應用程序中嘗試它時,由于Spring Security的緣故,我無法訪問它。 在這種特殊情況下,我可以解決該問題,因為該應用程序將Requestmap實例存儲在數據庫中,但是我不想進行可能忘記撤消的更改,并且存在雞與蛋的問題必須知道此部署的數據庫設置是什么。 因此,我改為將servlet轉換為servlet過濾器,并確保將過濾器添加到web.xml的Spring Security過濾器鏈之前,并在重新啟動服務器后按預期工作。

我在爆炸的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的相應<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>

要訪問控制臺,請導航至http:// server:port / contextPath / hack。 與在控制臺插件中一樣,您可以運行任意Groovy代碼(包括服務方法調用,使用域類等),并且在綁定中可以使用多個對象– config , ctx , grailsApplication , out , request和session 。

要將uri從/ hack更改為其他內容,請確保同時更新web.xml的<url-pattern>標簽和過濾器類中生成的表單中的action屬性。

假設您已將Grails應用程序部署到服務器上–如何查找應用程序的配置方式? 如果您有資料來源,那么您……

此條目發布于2017年12月7日星期四上午8:23,并根據grails , groovy , java , security提交。 您可以通過RSS 2.0 feed跟蹤對此條目的任何響應。 您可以在自己的網站上留下回復 (審核審核)或引用 。

翻譯自: https://www.javacodegeeks.com/2017/12/adding-lite-groovy-web-console-grails-war.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的在Grails战争中添加“精简” Groovy Web控制台的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。