Java HTTP代理Servlet错误

Java HTTP代理Servlet错误,java,maven,tomcat,servlets,proxy,Java,Maven,Tomcat,Servlets,Proxy,让我先说这是昨天的工作,所以我完全不明白为什么它突然停止工作。Java/插件并不是我的专长 我正在开发一个应用程序,它可以对另一个域上的服务器进行POST和GET调用。这是一个Maven项目。为了避免跨源问题,我有一个httpproxy.ProxyServlet插件 我将在这里列出所有正在工作的问题,但基本上,问题和错误在本文的底部进行了总结 pom.xml <dependencies> <dependency> <groupId>ja

让我先说这是昨天的工作,所以我完全不明白为什么它突然停止工作。Java/插件并不是我的专长

我正在开发一个应用程序,它可以对另一个域上的服务器进行POST和GET调用。这是一个Maven项目。为了避免跨源问题,我有一个httpproxy.ProxyServlet插件

我将在这里列出所有正在工作的问题,但基本上,问题和错误在本文的底部进行了总结

pom.xml

<dependencies>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.1</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.mitre.dsmiley.httpproxy</groupId>
        <artifactId>smiley-http-proxy-servlet</artifactId>
        <version>1.6</version>
    </dependency>

</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.0.2</version>
            <configuration>
                <source>1.5</source>
                <target>1.5</target>
            </configuration>
        </plugin>
        <!--        War plugin below is required for above plugin to build project without errors.    http://stackoverflow.com/questions/7539970/cannot-construct-org-apache-maven-plugin-war-util-webappstructure-as-it-does-not-->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.1.1</version>
        </plugin>
    </plugins>
如何在上面传递截获URL的语法位于此链接的底部。哪个是插件。再说一次。。。我昨天在工作

终于。错误:

<html><head><title>Apache Tomcat/7.0.39 - Error report</title><style><!--H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}A.name {color : black;}HR {color : #525D76;}--></style> </head><body><h1>HTTP Status 500 - Trying to process targetUri init parameter: java.net.URISyntaxException: Illegal character in path at index 71: http://cslxintwebdev3.csmc.edu:8087/aaenroll/rest/userProfile/userName/{_username}.json?user={_username}</h1><HR size="1" noshade="noshade"><p><b>type</b> Exception report</p><p><b>message</b> <u>Trying to process targetUri init parameter: java.net.URISyntaxException: Illegal character in path at index 71: http://cslxintwebdev3.csmc.edu:8087/aaenroll/rest/userProfile/userName/{_username}.json?user={_username}</u></p><p><b>description</b> <u>The server encountered an internal error that prevented it from fulfilling this request.</u></p><p><b>exception</b> <pre>javax.servlet.ServletException: Trying to process targetUri init parameter: java.net.URISyntaxException: Illegal character in path at index 71: http://cslxintwebdev3.csmc.edu:8087/aaenroll/rest/userProfile/userName/{_username}.json?user={_username}
org.mitre.dsmiley.httpproxy.ProxyServlet.initTarget(ProxyServlet.java:156)
org.mitre.dsmiley.httpproxy.ProxyServlet.init(ProxyServlet.java:140)
javax.servlet.GenericServlet.init(GenericServlet.java:160)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:947)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1009)
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
java.lang.Thread.run(Thread.java:722)
错误:

<servlet-class>org.mitre.dsmiley.httpproxy.URITemplateProxyServlet</servlet-class>
<init-param>
    <param-name>targetUri</param-name>
    <param-value>{authserver}/aaenroll/rest/userProfile/userName/{_username}.json?user={_username}</param-value>
    ...
我知道username在javascript调用中有一个值。变量未正确应用于web.xml中的模板


再次感谢

这主要是servlet映射的问题。 根据,我没有看到任何迹象表明类
ProxyServlet
允许参数化(尽管它可能允许)。也许您应该改用class
URITemplateProxyServlet
。 您将更改servlet定义,如下所示:

<servlet-mapping>
  <servlet-name>user_profile</servlet-name>
  <url-pattern>/userProfile/*</url-pattern>
</servlet-mapping>

因此,我正在阅读
URITemplateProxyServlet
,我认为它可能期望一对一的参数匹配。换句话说,对于targetUri中的每个参数,querystring中必须有一个匹配的参数(即ajax生成的URL)。不幸的是,我无法测试,但您应该能够快速判断这是否是事实

试试这个:

  • 为了避免混淆,将url模式设置为具有第二个“/”,就像它们的一样
  • 更改ajax生成的URL以匹配此模式并具有第二个参数:
    “userProfile/subpath?”\u username=“+username+”&\u username2=“+username
  • 根据需要更改目标uri:
    ${authserver}/aaenroll/rest/userProfile/userName/{u userName}.json?user={u username2}

嗯,我终于弄明白了问题所在。由于我试图使用相同的_usernameparam来填充targetUri中的两个位置,其中一个位置丢失了。基本上,您不能使用此插件将同一参数应用于targetUri两次

解决方案: web.xml


用户名中缺少$符号?(在web.xml中它不是{u username}而是${u username})它不是jQuery变量。这是我知道这种语法的唯一原因。此外,插件页面底部的示例概述了如何编写参数化代理URL,该示例显示javascript中variablesprint
var username
上没有$,它的值是多少?username变量在javascript中正确填充。它在被插件截获的过程中迷失了方向。这似乎更近了。${authServer}实际上是一个服务器属性。最终将成为应用程序属性。所以我只需要传递用户名参数。现在的错误是HTTP状态500-缺少HTTP参数_username要填充模板,我打印了username变量的值。因此我知道它在javascript变量中。它在ajax调用和插件之间的某个地方丢失了,该插件提取它并使用它替换URL模板中的参数。。嗯。你的javascript生成的
url
是什么?确保它不是时髦的。还考虑在URL中的最后一个斜杠之后添加其他东西(虽然它不需要它),比如<代码>“用户配置文件/BLAH?”UsErrNe= =“+用户名;
url正是“userProfile?”\u username=segotac“删除了userProfile后面的“/”,因为这似乎使它变得更糟。url必须与servlet映射中的模式匹配。对于
/userProfile/*
URL必须有一个起始“/”、字符串userProfile、另一个“/”,然后是其他任何内容。如果您的URL实际上是
http://server/userProfile?_username=segotac
,那么模式应该是
/userProfile*
——但是我不知道如果
URITemplateProxyServlet
不接近文档链接中的模式(见上文),它是否会运行良好。 java.net.URISyntaxException: Illegal character in path at index 71: http://example.com:8087/aaenroll/rest/userProfile/userName/{_username}.json?user={_username} java.net.URI$Parser.fail(URI.java:2829) java.net.URI$Parser.checkChars(URI.java:3002) java.net.URI$Parser.parseHierarchical(URI.java:3086) java.net.URI$Parser.parse(URI.java:3034) java.net.URI.<init>(URI.java:595) org.mitre.dsmiley.httpproxy.ProxyServlet.initTarget(ProxyServlet.java:154) org.mitre.dsmiley.httpproxy.ProxyServlet.init(ProxyServlet.java:140) javax.servlet.GenericServlet.init(GenericServlet.java:160) org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:947) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1009) org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) java.lang.Thread.run(Thread.java:722)
<servlet-class>org.mitre.dsmiley.httpproxy.URITemplateProxyServlet</servlet-class>
<url-pattern>/userProfile/*</url-pattern>
url: "userProfile?_username=" + username,
HTTP Status 500 - Missing HTTP parameter _username to fill the template
<servlet-class>org.mitre.dsmiley.httpproxy.URITemplateProxyServlet</servlet-class>
<init-param>
    <param-name>targetUri</param-name>
    <param-value>{authserver}/aaenroll/rest/userProfile/userName/{_username}.json?user={_username}</param-value>
    ...
<servlet-mapping>
  <servlet-name>user_profile</servlet-name>
  <url-pattern>/userProfile/*</url-pattern>
</servlet-mapping>
...
url: "userProfile/?authserver=" + authserver + "&_username=" + username;
...
<servlet>
    <servlet-name>user_profile</servlet-name>
    <servlet-class>org.mitre.dsmiley.httpproxy.URITemplateProxyServlet</servlet-class>
    <init-param>
        <param-name>targetUri</param-name>
        <param-value>${authserver}/aaenroll/rest/userProfile/userName/{_username}.json?user={_username2}</param-value>
    </init-param>
    <init-param>
        <param-name>log</param-name>
        <param-value>true</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>user_profile</servlet-name>
    <url-pattern>/userProfile/*</url-pattern>
</servlet-mapping>
$.ajax({
    type: "GET",
    beforeSend: function(request)
    {
        request.setRequestHeader("Authorization", authToken);
    },
    url: "userProfile?_username=" + username + "&_username2=" + username;, //Url intercepted by servlet plugin. Full path mapping is available in web.xml
    success: function(msg, success) {
    },
    error: function(xhr, ajaxOptions, thrownError) {
    }
});