前言:
而今大家对“apache泛域名反向代理”大约比较关心,朋友们都想要剖析一些“apache泛域名反向代理”的相关内容。那么小编同时在网摘上网罗了一些关于“apache泛域名反向代理””的相关知识,希望看官们能喜欢,各位老铁们快快来了解一下吧!前言(什么是反向代理)
反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
举个例子,比如我访问百度(),但是我们其实并不知道百度内部到底有多少台服务器、百度是怎么处理这次请求的以及我们应该访问那台服务器。我们只是知道我访问了百度()的域名或者公网IP,然后就返回了结果。至于百度前置网关服务根据规则进行转发(至于转发到那台服务器,由负载均衡处理)以及后端服务器处理对外面的用户来说是隐藏的。
注意⚠️反向代理和正向代理的区别。
JAVA如何实现反向代理
Java实现反向代理功能其实非常的简单,因为在Github中有一个开源项目()HTTP-Proxy-Servlet基于Servlet实现了请求代理。同时这个项目Http请求是依赖于Apache HttpClient项目。
HTTP-Proxy-Servlet如何使用实现反向代理
首先:引入HTTP-Proxy-Servlet项目依赖
<dependency> <groupId>org.mitre.dsmiley.httpproxy</groupId> <artifactId>smiley-http-proxy-servlet</artifactId> <version>1.11</version></dependency>
第二步:配置路由策略,注册Servlet
@Configurationpublic class ProxyServletConfig { @Bean public Servlet getProxyServlet() { return new ProxyServlet(); } /** * 这里可以多加几个,但是servlet名字需要不一样 */ @Bean public ServletRegistrationBean proxyServletRegistrationBean() { // 配置路由策略 ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(getProxyServlet(), ContextConstants.PROXY_URL_PATTERN); Map<String, String> params = new HashMap<>(); // 路由策略 params.put("targetUri", ";); params.put(ProxyServlet.P_LOG, "true"); servletRegistrationBean.setInitParameters(params); return servletRegistrationBean; }}
其实这样,启动项目就可以实现反向代理的功能了。但是这种是静态的配置,如果我要基于数据库实现动态的方向代理服务应该怎么做呢?
实现基于数据库动态方向代理
还记得在第二步中有一个ProxyServlet吗?其实我们可以继承这个类实现里面的service(HttpServletRequest request, HttpServletResponse response)方法即可。这里注意这两行代码是反向代理的关键,因为是通过attribute中这两个属性进行判断的。
protected static final String ATTR_TARGET_URI = ProxyServlet.class.getSimpleName() + ".targetUri";protected static final String ATTR_TARGET_HOST = ProxyServlet.class.getSimpleName() + ".targetHost";@Overrideprotected void service(HttpServletRequest servletRequest, HttpServletResponse servletResponse) throws ServletException, IOException { // ...(忽略)... servletRequest.setAttribute(ATTR_TARGET_URI, proxyTarget.getTargetUri()); servletRequest.setAttribute(ATTR_TARGET_HOST, gson.fromJson(gson.toJson(proxyTarget.getHttpHost()), HttpHost.class)); // ...(忽略)...}
看到这里聪明的同学们肯定知道应该怎么做了吧,只要在这里读取数据库中的路由规则,然后将刚刚ProxyServletConfig配置类中的路由规则写成(拦截(/*)所有路径并targetUri写成固定即可,反正targetUri已经失效),还要把注册的Servlet改成自己实现的Servlet即可。
怎么样,是不是非常简单实用~
标签: #apache泛域名反向代理