在使用smiley-http-proxy-servlet实现反向代理时,发现在进行转发时原始request中的cookie信息丢失了。翻看了其源代码后发现在ProxyServlet进行http转发时是有copy原始request中的header(包括cookie)的操作的,如下:
/** Copy request headers from the servlet client to the proxy request. */
protected void copyRequestHeaders(HttpServletRequest servletRequest, HttpRequest proxyRequest) {
// Get an Enumeration of all of the header names sent by the client
Enumeration enumerationOfHeaderNames = servletRequest.getHeaderNames();
while (enumerationOfHeaderNames.hasMoreElements()) {
String headerName = (String) enumerationOfHeaderNames.nextElement();
//Instead the content-length is effectively set via InputStreamEntity
if (headerName.equalsIgnoreCase(HttpHeaders.CONTENT_LENGTH))
continue;
if (hopByHopHeaders.containsHeader(headerName))
continue;
Enumeration headers = servletRequest.getHeaders(headerName);
while (headers.hasMoreElements()) {//sometimes more than one value
String headerValue = (String) headers.nextElement();
// In case the proxy host is running multiple virtual servers,
// rewrite the Host header to ensure that we get content from
// the correct virtual server
if (headerName.equalsIgnoreCase(HttpHeaders.HOST)) {
HttpHost host = getTargetHost(servletRequest);
headerValue = host.getHostName();
if (host.getPort() != -1)
headerValue += ":"+host.getPort();
// 就是下面这句copy了cookie
} else if (headerName.equalsIgnoreCase(org.apache.http.cookie.SM.COOKIE)) {
headerValue = getRealCookie(headerValue);
}
proxyRequest.addHeader(headerName, headerValue);
}
}
}
但是在进行copy时做了限定——只copy name为特定前缀的cookie,该方法代码如下:
/** The string prefixing rewritten cookies. */ protected String getCookieNamePrefix() { return "!Proxy!" + getServletConfig().getServletName(); }
而原始的cookie均不是该前缀,因此出现了cookie丢失的问题。找到问题原因之后,要修改就容易了很多。要么将原始cookie name追加相应的前缀,要么实现一个URITemplateProxyServlet的子类,覆写getCookieNamePrefix方法即可。
相关推荐
java运行依赖jar包
java运行依赖jar包
Smiley的HTTP代理Servlet 这是Java Servlet形式的HTTP代理(也称为网关)。 HTTP代理对于AJAX应用程序与托管Web应用程序以外的主机上的Web可访问服务进行通信很有用。 它是反向代理,实际上不是转发代理,尽管...
在构建微服务架构时,我们可能需要在单个入口点处理多个服务的请求,这时就涉及到了代理和反向代理的概念。`ProxyServlet`是Apache的Tomcat服务器提供的一种用于实现HTTP代理的Servlet,它允许我们将来自客户端的...
【标题】"smileys-proxy-servlet"是一个基于Java的HTTP代理Servlet,它利用了Smiley库提供的功能。这个库的主要目的是在服务器端为应用程序提供一个代理服务,允许通过Servlet容器来转发HTTP请求。Smiley库是专门为...
然而,有时候我们在尝试运行一个Servlet时可能会遇到"因缺少代理类而无法加载运行的servlet类"这样的错误,这通常意味着在部署或配置过程中遇到了问题。本文将深入探讨这个问题,并围绕"代理类"这个关键概念进行讲解...
【Java HttpProxy实现详解——基于Jetty Servlet与HttpClient】 在Java开发中,有时我们需要创建一个HTTP代理服务器,以便转发客户端的HTTP请求到指定的目标服务器。本文将深入探讨如何使用Jetty Servlet容器和...
反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个...
Spring Boot 2.X 负载均衡和反向代理实现过程解析 Spring Boot 2.X 是一个基于 Java 的框架,提供了多种方式来实现负载均衡和反向代理。在这篇文章中,我们将详细介绍如何使用 Spring Boot 2.X 实现负载均衡和反向...
标题“smiley-sans-v1.1.1.zip”表明这是一个软件更新的压缩包,版本号为v1.1.1,很可能包含了字体资源。标签“font”进一步证实了这一点,意味着这个压缩包里面是与字体相关的文件。 在这个压缩包中,我们可以看到...
Smiley Sans字体家族以其独特的名字和斜体形式,很可能具有某种微笑或快乐的设计元素,使得在文本中使用时能够传达出轻松愉快的氛围。在设计上,这种字体可能强调了友好的视觉效果,适用于儿童产品、娱乐内容或者...
Logging Proxy 是一个简单的代理 Servlet,它将其请求转发到一个或多个在 servlet 的 init 参数中配置的服务器,并可选择将请求、响应和标头记录为文件。 它已经在 Tomcat 8 上进行了测试。它不是一个可以在浏览器中...
**Unicode Smiley-crx插件**是一款专为增强文本输入体验设计的浏览器扩展程序,尤其适合那些喜欢在聊天、邮件或者社交媒体中使用表情符号的用户。这款插件支持多语言,其中包括法语(Français),它使得用户能够...
Zuul与紧密,Smiley的HTTP代理Servlet很简单,没有高级功能。 Charon是通用的Spring Boot工具。 它已经实现了许多功能,其体系结构提供了添加新功能的简便方法。产品特点高度可配置和可扩展Spring 和支持多请求转发...
smiley, python 应用程序跟踪程序 smiley----python-应用程序跟踪程序Smiley包括几个运行 python 程序和监视记录和报告的内部细节的子命令。 安装和使用 有关详细信息,请参阅 https://smiley.readthedocs.org
【PHP Smiley 开源项目详解】 PHP Smiley 是一个开源的PHP库,专门设计用于处理文本中的表情符号,也就是我们常说的“笑脸”。这个库提供了一种高效且便捷的方法,可以将文本中的笑脸代码(例如":)")自动转换为...
<groupId>org.mitre.dsmiley.httpproxy</groupId> <artifactId>smiley-http-proxy-servlet</artifactId> <version>1.7 ``` 2. **配置代理Servlet**: 创建一个配置类,如`ProxyServletConfiguration`,该类...
$ cd smiley $ sudo npm -g install grunt-cli karma bower $ npm install $ bower install $ grunt watch 最后,在浏览器中打开file:///path/to/smiley/build/index.html 。 祝您黑客愉快! 目的 ngBoilerplate...
Diese Seite bei 教程 迪斯(Dieses Projekt)Bearbeiten Um在MakeCode zu bearbeiten中死亡存储库。 öffnehttps //makecode.microbit.org/ klicke auf Importieren和dann auf Importiere URL ...
anim_save("smiley_face.gif", smile_gif) ``` 这段代码会创建一个持续时间较长的动画,眼睛在1到-1的范围内上下移动,动画平滑地过渡。`ease_aes`函数用来设置动画的缓动效果,这里我们选择线性过渡。最后,`anim_...