1. 程式人生 > >jetty代理伺服器新增filter過濾器

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代理伺服器時,在你的過濾器中寫相應的需求就能實現一定的功能。