11

Java Servlet API は、リクエストを同じサーバー内の別のパス (同一の host:port ) に転送できます。しかし、別の host:port への転送 (プロキシのように) は別の話です。

私はJersey Clientでそれをやろうとしました.ServletRequest - method, headers, mediatype and body -をJersey ClientRequest異なるベースuriを持つ)に適応させ、呼び出しを行い、Jersey ClientResponse - method、headers、 mediatype と body — ServletResponseへ。

それらを手動で適応させるのは私には間違っているようです。

純粋なサーブレット API ソリューションはありませんか? または、ホスト: ポートを変更するときに要求を前後に適応させることができる HTTP クライアントですか?

4

3 に答える 3

8

HTTP-Proxy-Servletはまさに必要なことを行います。

クイック構成

pom.xml

<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>http://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>

春の統合

参照: HTTP-Proxy-Servlet Issue #15

pom.xml

<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);
    }
}

Bean の構成

<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">http://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>
于 2015-10-17T21:59:18.900 に答える
3

javax.net.HttpURLConnectionを使用する必要があります

そのための疑似コードは次のとおりです。

URL url = new URL("http://otherserver:otherport/url");
HttpURLConnection connection = (HttpURLConnection)url.openConnection();

// set http method if required
connection.setRequestMethod("POST");

// set request header if required
connection.setRequestProperty("header1", "value1");

// check status code
if(connection.getResponseCode() == 200) {

   InputStream is = connection.getInputStream();
   //transfer is to the required output stream
} else {
   //write error
}
于 2012-06-02T08:24:05.730 に答える
0

私が理解している限りrequest、サーブレットから sを送信responseし、他のサーバーから自分のサーバーに取得する必要があります。そのためにはHTTP クライアント(概要) が必要な場合があります。
この質問も役立つかもしれません。

于 2012-06-02T07:44:29.910 に答える