条件HTTP代理Servlet校验不通过时如何继续原有请求流程
问题背景
开发需实现HTTP代理逻辑,将符合校验规则的请求转发至远端服务器,不可修改现有web.xml中的URL Pattern配置。
现有web.xml配置片段如下:
<servlet> <servlet-name>SomeServlet</servlet-name> <servlet-class>SomeServlet</servlet-class> <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping> <servlet-name>SomeServlet</servlet-name> <url-pattern>/pattern1/*</url-pattern> </servlet-mapping>
原有SomeServlet的业务逻辑运行正常,代理逻辑初始基于HttpServlet实现,代码如下:
public class proxyServlet extends HttpServlet { /* 已完成init等初始化配置*/ @Overrirde protected void service(HttpServletRequest servletRequest, HttpServletResponse servletResponse) throws ServletException, IOException { /* 校验请求规则,匹配则返回远端服务地址,不匹配返回null */ String endPoint = checkForConditions(servletRequest); if(endPoint == null) { return; // 直接return会中断请求流程,原有业务无法执行 } else { HttpRequest newR = new BasicHttpRequest(method, endPoint); doExecute(servletRequest, newR) } } }
核心问题
- 校验不通过(endPoint为null)时直接return会终止整个请求链路,原有匹配
/pattern1/*的业务逻辑无法正常执行 - 若使用Servlet原生forward转发放行,请求会再次匹配
/pattern1/*的URL规则,重复进入代理逻辑触发无限循环
实现方案
放弃直接在HttpServlet中实现代理拦截的思路,改用Servlet Filter实现代理逻辑,无需改动任何现有URL Pattern配置:
- 为Filter配置匹配
/pattern1/*路径,设置执行顺序优先于原有SomeServlet - 校验请求符合转发规则时,直接使用HttpClient构造请求发送至远端服务器,将远端返回的响应结果写回当前响应对象即可
- 校验不满足转发条件时,调用
chain.doFilter(request, response)直接放行,请求会沿原有链路正常进入SomeServlet执行业务逻辑,既不会中断流程,也不会触发循环匹配
内容的提问来源于stack exchange,提问作者user1609085
相关产品推荐
相关产品推荐

