jetty代理伺服器新增filter過濾器
儘管是剛開始學習jetty的小白,還是記錄一下自己的歷程。
嵌入式啟動jetty的確不是什麼難事,網上的例子也不少,現在是在代理伺服器中新增過濾器,這個確實就有一定的難度,首先你要知道如何去從jetty原始碼中分解出來jetty-proxy,這是一個可以獨立執行的工程,只要jar包足夠,啟動也是分分鐘的事情。不會的點這裡https://blog.csdn.net/qq_41084324/article/details/82658873
部落格裡說了,jetty是很NB的,代理伺服器它本身就有,在每一個jetty-proxy中的測試類中都有一個ProxyServer測試類, 我把程式碼貼出來,這是基於jetty9.3的。
package org.eclipse.jetty.proxy; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; public class ProxyServer { public static void main(String[] args) throws Exception { Server server = new Server(); ServerConnector connector = new ServerConnector(server); connector.setPort(8888); server.addConnector(connector); // Setup proxy handler to handle CONNECT methods ConnectHandler proxy = new ConnectHandler(); // proxy.setWhite(new String[]{"mail.google.com"}); // proxy.addWhitelistHost("www.google.com"); server.setHandler(proxy); // Setup proxy servlet ServletContextHandler context = new ServletContextHandler(proxy, "/", ServletContextHandler.SESSIONS); ServletHolder proxyServlet = new ServletHolder(ProxyServlet.class); // proxyServlet.setInitParameter("whiteList", "google.com, www.eclipse.org, localhost"); // proxyServlet.setInitParameter("blackList", "google.com/calendar/*, www.eclipse.org/committers/"); context.addServlet(proxyServlet, "/*"); server.start(); } }
當你完全把jetty-proxy從jetty原始碼中分離出來後,右鍵執行他的ProxyServer就相當於啟動了一個代理伺服器,修改IE埠為8888就能代理一切瀏覽器訪問。
代理伺服器的啟動很簡單,畢竟原本就存在,現在是在jetty代理伺服器中加filter,當然你可以加一個簡單的過濾器,我的專案需求是加一個很龐大的filter工程,其實方式都是一樣的,再龐大的filter工程也都是需要一個filter入口。最終達到的目的是:你訪問的某個url得到返回值後,過濾器會對你的返回值進行過濾操作。新增filter的程式碼直接貼出來了
package org.eclipse.jetty.proxy.test; import java.util.EnumSet; import javax.servlet.DispatcherType; import javax.servlet.Filter; import org.eclipse.jetty.proxy.ConnectHandler; import org.eclipse.jetty.proxy.ProxyServlet; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; import org.eclipse.jetty.servlet.FilterHolder; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHandler; import org.eclipse.jetty.servlet.ServletHolder; import com.zhibei.filter.OTLFilter; public class ProxyServer { public static void main(String[] args) throws Exception { Server server = new Server(); ServerConnector connector = new ServerConnector(server); connector.setPort(8889); server.addConnector(connector); // Setup proxy handler to handle CONNECT methods ConnectHandler proxy = new ConnectHandler(); // proxy.setWhite(new String[]{"mail.google.com"}); // proxy.addWhitelistHost("www.google.com"); server.setHandler(proxy); // Setup proxy servlet ServletContextHandler context = new ServletContextHandler(proxy, "/", ServletContextHandler.SESSIONS); ServletHolder proxyServlet = new ServletHolder(ProxyServlet.class); // proxyServlet.setInitParameter("whiteList", "google.com, www.eclipse.org, localhost"); // proxyServlet.setInitParameter("blackList", "google.com/calendar/*, www.eclipse.org/committers/"); context.addServlet(proxyServlet, "/*"); ServletHandler handler = new ServletHandler(); FilterHolder fh = handler.addFilterWithMapping((Class<? extends Filter>) OTLFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST)); // fh.setInitParameter("initParamKey", "InitParamValue"); context.addFilter(fh, "/*", EnumSet.of(DispatcherType.REQUEST)); server.start(); } }
你會發現在最後加入了這樣一段程式碼:
ServletHandler handler = new ServletHandler(); FilterHolder fh = handler.addFilterWithMapping((Class<? extends Filter>) OTLFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST));
context.addFilter(fh, "/*", EnumSet.of(DispatcherType.REQUEST));
OTLFilter是我專案中的Filter入口,也就是filter過濾器的類名。這樣就是新增成功,當你啟動jetty-proxy代理伺服器時,在你的過濾器中寫相應的需求就能實現一定的功能。