- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个安装了 Tuckey 的 Tomcat 服务器作为代理,用于将请求转发到具有嵌入式 Jetty 服务器的应用程序。带有嵌入式 Jetty 的应用程序公开了一个 REST url 但不提供授权。因此,我需要区分对管理 url 和非管理 url 的请求。在 Tomcat 内部,我创建了一个名为“myapp”的应用程序,其中包含一个用于 Tuckey 的过滤器。这是当前的 urlrewrite.xml:
<?xml version="1.0" encoding="UTF-8"?>
<urlrewrite>
<rule match-type="regex">
<note>Allow all these requests</note>
<from>^/v1/api/(one|two|three)/(.*)$</from>
<to type="proxy" encode="false">http://admin-user:admin-password@localhost:8091/myapp/v1/api/$1/${escapePath:UTF-8:$2}</to>
</rule>
<rule match-type="regex">
<note>These requests must be authorised</note>
<from>^/v1/api/(four|five|six)(.*)$</from>
<to type="proxy" encode="false">http://localhost:8091/myapp/v1/api/$1${escapePath:UTF-8:$2}</to>
</rule>
</urlrewrite>
这通常有效 - 除非用户向第一条规则发送不必要的用户凭据。在这种情况下,来自用户的基本身份验证请求被转发到 Jetty,导致未经授权的响应。如果用户可以简单地省略用户名和密码(不幸的是,这并不总是可能的,因为这种行为可能是由客户端的逻辑强制执行的)那么这就不会发生并且请求会顺利通过。
有什么解决办法吗?我可以在 Tuckey 中以某种方式删除基本身份验证 header 吗? set 命令显然不允许设置 auth-type 或类似的。
最佳答案
最后,一位同事帮助我完成了这项工作。
urlrewrite.xml 如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<urlrewrite>
<rule match-type="regex">
<note>Allow all these requests</note>
<from>^/v1/api/(one|two|three)/(.*)$</from>
<to type="proxy" encode="false">http://admin-user:admin-password@localhost:8091/myapp/v1/api/$1/${escapePath:UTF-8:$2}</to>
</rule>
<rule match-type="regex">
<note>These requests must be authorised</note>
<from>^/v1/api/(four|five|six)(.*)$</from>
<to type="proxy" encode="false">http://localhost:8091/myapp/v1/api/$1${escapePath:UTF-8:$2}</to>
</rule>
</urlrewrite>
如您所见,“公共(public)”和“私有(private)”REST URL 有两种不同类型的 URL。对于私有(private) URL,一切正常,它只是转发到我在 8091 运行的本地 Jetty 服务器。对于公共(public) URL,用户名和密码被注入(inject)到 URL 中。如果有人不提供用户名和密码,这就可以正常工作。然而,如果有人确实提供了它们,会发生什么?不幸的是,在这种情况下,仍然会在 Jetty 中触发授权,结果失败(除非用户名和密码是管理员)。这(还)不是我们想要的。
解决方案是从原始请求中删除授权 header 。在类 org.tuckey.web.filters.urlrewrite.RequestProxy
中有方法 setupProxyRequest(HttpServletRequest, URL)
。请注意在 while
循环中添加的 else if
block 在某些情况下会丢弃授权 header 。
private static HttpMethod setupProxyRequest(final HttpServletRequest hsRequest, final URL targetUrl) throws IOException {
final String methodName = hsRequest.getMethod();
final HttpMethod method;
if ("POST".equalsIgnoreCase(methodName)) {
PostMethod postMethod = new PostMethod();
InputStreamRequestEntity inputStreamRequestEntity = new InputStreamRequestEntity(hsRequest.getInputStream());
postMethod.setRequestEntity(inputStreamRequestEntity);
method = postMethod;
} else if ("GET".equalsIgnoreCase(methodName)) {
method = new GetMethod();
} else {
log.warn("Unsupported HTTP method requested: " + hsRequest.getMethod());
return null;
}
method.setFollowRedirects(false);
method.setPath(targetUrl.getPath());
method.setQueryString(targetUrl.getQuery());
String userInfo = targetUrl.getUserInfo();
Enumeration e = hsRequest.getHeaderNames();
if (e != null) {
while (e.hasMoreElements()) {
String headerName = (String) e.nextElement();
if(headerName != null) headerName = headerName.trim();
if ("host".equalsIgnoreCase(headerName)) {
//the host value is set by the http client
continue;
} else if ("content-length".equalsIgnoreCase(headerName)) {
//the content-length is managed by the http client
continue;
} else if ("accept-encoding".equalsIgnoreCase(headerName)) {
//the accepted encoding should only be those accepted by the http client.
//The response stream should (afaik) be deflated. If our http client does not support
//gzip then the response can not be unzipped and is delivered wrong.
continue;
} else if (headerName.toLowerCase().startsWith("cookie")) {
//fixme : don't set any cookies in the proxied request, this needs a cleaner solution
continue;
}
else if (headerName.toLowerCase().contains("authorization") && userInfo != null) {
// Removed authorization header when userInfo is present
continue;
}
Enumeration values = hsRequest.getHeaders(headerName);
while (values.hasMoreElements()) {
String headerValue = (String) values.nextElement();
log.info("setting proxy request parameter:" + headerName + ", value: " + headerValue);
method.addRequestHeader(headerName, headerValue);
}
}
}
if (userInfo != null) {
String headerValue = "Basic " + new String(Base64.encodeBase64(userInfo.getBytes()));
if ( log.isInfoEnabled()) log.info("setting proxy request parameter: Authorization, value: " + headerValue);
method.addRequestHeader("Authorization", headerValue);
}
if ( log.isInfoEnabled() ) log.info("proxy query string " + method.getQueryString());
return method;
}
web.xml 如下所示:
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>URL Rewriting proxy</display-name>
<servlet>
<servlet-name>default</servlet-name>
<!-- Standard Tomcat default servlet -->
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<filter>
<filter-name>UrlRewriteFilter</filter-name>
<!-- Standard Tuckey default UrlRewriteFilter class -->
<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
</web-app>
关于tomcat - 删除 Tuckey url 重写中的基本身份验证 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35102231/
我一直在尝试在 tuckey 出站规则中使用可选的捕获组,但它不起作用。对此的任何帮助将不胜感激。 我们可以使用格式(.+)吗?作为 tuckey 中的可选捕获组。当我在 apache 中尝试时它工作
我正在尝试将所有 http 请求重定向到 https,除了“health.html”,我需要通过端口 80 上的标准 http 提供服务;出于某种原因,下面的规则似乎并没有这样做——我确定这是一个语法
我正在使用 Tuckey URLRewrite我需要一个接受除“/”或“\”以外的所有内容的规则 我已经写了一条规则,但是 tucker 显示无休止的异常并且没有加载页面 ^
我在 tuckey URL 出站规则方面遇到了问题。我能够设置入站规则,但我需要使用出站规则转换 URL。我们在 Spring 中使用 tuckey。 出站规则: ^/domain.mvc?
我有一个简单的 tuckey 规则将一条路径转发到另一条路径,它看起来像: foo some condition based on device ^/abc/(.*)$ /xyz/$
如何使用 tuckey UrlRewrite 将 url 中的每个字母小写?这就是我现在所拥有的,但似乎不起作用。 (.*) ${lower:$1} 最佳答案 您应该设置一个检查大写字母的条件。试
我的问题是,我的 urewrite.xml 文件中的相似规则存在问题,事实上第一条规则有效,但后面的相似规则无效。这是一个例子: Porsche-911_991-3.4_Carrera.jsp ca
我正在使用urlrewritefilter美化我的产品链接以获得更好的谷歌索引(删除产品参数)。 示例: .../product/snowboarda 通过url重写规则传输到 .../product
我使用的是将 use-query-string 设置为默认值 (false) 的 Tuckey urlrewrite 过滤器。这意味着来自 url 不使用查询参数来匹配。在孤立的情况下,我想做的是重命
我想永久重定向 /?industry_id=3 to /industry/3/athletics 我尝试了规则: /?industry_id=3$ /industry/3/athl
我在 Glassfish 上的 JSF 中使用 tuckey urlrewrite 过滤器来清理 url。以下是过滤器的规则(不起作用): ^/user/(.*)$
我正在使用 Jersey 框架,我的端点是 /v1/users/{user_id:\p{XDigit}{8}}/orders/{order_id:\p{XDigit}{8}}. 我需要的是重写url
我有以下规则: ^/users/(.*)$ /users.do$1 我想匹配以下网址: http://localhost:8077/users/?elemsPerPage=10
我正在将 tomcat 与 tukey 一起用于 URLRewrite。我的 urlrewrite.xml 中几乎没有规则。我怎样才能确保如果其中一条规则匹配;它停止处理进一步的规则! 最佳答案 找到
我有一个安装了 Tuckey 的 Tomcat 服务器作为代理,用于将请求转发到具有嵌入式 Jetty 服务器的应用程序。带有嵌入式 Jetty 的应用程序公开了一个 REST url 但不提供授权。
我正在使用 tuckey url 重写过滤器,我想将语言扩展名 (.cfm) 添加到干净的 url。 (我知道我假设路径中的最后一个词始终是脚本。) 比如我想把.cfm加到 /someScript /
我正在尝试将 URL 重写映射存储在单独的文件中。 我找到了一些关于使用 .Net 或 Apache 的答案,但没有找到如何在 Tomcat 中使用 Tuckey 来做到这一点的方法。 有谁知道 Tu
我一直在研究如何在 Tomcat 8 上执行 URL 重写,并不断遇到相同的两个建议。 1) 使用 Tuckey URLRewriteFilter。2) 在 Tomcat 之上运行 Apache 以使
我正在尝试使用 Tuckey urlRewriteFilter 将任何 URL 重写为 https://,同时保留附加到 URL 的任何查询字符串参数。我的 urlrewrite.xml 文件目前看起
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭10 年前。 Improve th
我是一名优秀的程序员,十分优秀!