将 servlet 请求转发到另一台服务器

编程入门 行业动态 更新时间:2024-10-28 18:23:48
本文介绍了将 servlet 请求转发到另一台服务器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

Java Servlet API 可以将请求转发到同一服务器内的另一个路径(相同的主机:端口).但是,转发到不同的主机:端口——就像代理一样——是另一回事.

Java Servlet API can forward requests to another path within the same server (identical host:port). But, forwarding to a different host:port — like proxy do — is another story.

我已经尝试使用 Jersey Client 来做到这一点,调整了 ServletRequest — 方法、标头、媒体类型和正文 — 到 Jersey ClientRequest(使用不同的基本 uri),进行调用,并重新调整 Jersey ClientResponse — 方法、标题、媒体类型和正文 — 到 ServletResponse.

I've tried to do that with Jersey Client, adapting the ServletRequest — method, headers, mediatype and body — to a Jersey ClientRequest (with a different base uri), making the call, and adapting back the Jersey ClientResponse — method, headers, mediatype and body — to the ServletResponse.

手动调整这些在我看来是错误的.

Adapting those manually seems wrong to me.

没有纯粹的 Servlet API 解决方案吗?或者一个能够在更改主机:端口时来回调整请求的 HTTP 客户端?

Isn't there a pure Servlet API solution? Or an HTTP client capable of adapting requests back and forth when changing the host:port?

推荐答案

HTTP-Proxy-Servlet 正是您所需要的.

<dependency> <groupId>org.mitre.dsmiley.httpproxy</groupId> <artifactId>smiley-http-proxy-servlet</artifactId> <version>1.7</version> </dependency>

web.xml

<servlet> <servlet-name>solr</servlet-name> <servlet-class>org.mitre.dsmiley.httpproxy.ProxyServlet</servlet-class> <init-param> <param-name>targetUri</param-name> <param-value>solrserver:8983/solr</param-value> </init-param> <init-param> <param-name>log</param-name> <param-value>true</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>solr</servlet-name> <url-pattern>/solr/*</url-pattern> </servlet-mapping>

Spring 集成

另见:HTTP-Proxy-Servlet 问题 #15

<dependency> <groupId>org.mitre.dsmiley.httpproxy</groupId> <artifactId>smiley-http-proxy-servlet</artifactId> <version>1.7</version> </dependency>

ServletWrappingControllerExt.java

import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.ServletWrappingController; public class ServletWrappingControllerExt extends ServletWrappingController { private String pathToStrip; public void setPathToStrip(String pathToStrip) { this.pathToStrip = pathToStrip; } @Override protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { final HttpServletRequest wrapper = new HttpServletRequestWrapper(request) { @Override public String getPathInfo() { //Please note that getPathInfo returns null if DispatcherServlet is configured to track url-pattern "/" //It should be configured to track url-pattern "/*". Below is a sample DispatcherServlet configuration /* <servlet> <servlet-name>spring</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>spring</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> */ String path = super.getPathInfo(); if (path.startsWith(pathToStrip)) { final int length = pathToStrip.length(); path = path.substring(length); } return path; } @Override public String getServletPath() { return super.getServletPath(); } }; return super.handleRequestInternal(wrapper, response); } }

Beans 配置

<bean id="myServletWrapper" class="ServletWrappingControllerExt"> <property name="pathToStrip" value="/solr"/> <property name="servletClass" value="org.mitre.dsmiley.httpproxy.ProxyServlet" /> <property name="servletName" value="solr" /> <property name="initParameters"> <props> <prop key="targetUri">solrserver:8983/solr</prop> <prop key="log">true</prop> </props> </property> </bean> <bean id="myServletUrlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="urlMap"> <map> <entry key="/solr/**" value-ref="myServletWrapper" /> </map> </property> <property name="order" value="1" /> </bean>

更多推荐

将 servlet 请求转发到另一台服务器

本文发布于:2023-10-10 01:01:35,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1477267.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:另一台   服务器   servlet

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!