`
han_zw
  • 浏览: 174432 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

smiley-http-proxy-servlet 反向代理时丢失cookie的问题

    博客分类:
  • java
 
阅读更多

在使用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方法即可。

分享到:
评论

相关推荐

    smiley-http-proxy-servlet-1.7.jar

    java运行依赖jar包

    smiley-http-proxy-servlet-1.7-sources.jar

    java运行依赖jar包

    HTTP-Proxy-Servlet:Smiley的HTTP代理实现为Java Servlet

    Smiley的HTTP代理Servlet 这是Java Servlet形式的HTTP代理(也称为网关)。 HTTP代理对于AJAX应用程序与托管Web应用程序以外的主机上的Web可访问服务进行通信很有用。 它是反向代理,实际上不是转发代理,尽管...

    Spring Boot 使用 ProxyServlet 代理并统一响应

    在构建微服务架构时,我们可能需要在单个入口点处理多个服务的请求,这时就涉及到了代理和反向代理的概念。`ProxyServlet`是Apache的Tomcat服务器提供的一种用于实现HTTP代理的Servlet,它允许我们将来自客户端的...

    smileys-proxy-servlet:使用Smiley的库(https

    【标题】"smileys-proxy-servlet"是一个基于Java的HTTP代理Servlet,它利用了Smiley库提供的功能。这个库的主要目的是在服务器端为应用程序提供一个代理服务,允许通过Servlet容器来转发HTTP请求。Smiley库是专门为...

    因缺少代理类而而无法加载运行的servlet类(接收post请求)

    然而,有时候我们在尝试运行一个Servlet时可能会遇到"因缺少代理类而无法加载运行的servlet类"这样的错误,这通常意味着在部署或配置过程中遇到了问题。本文将深入探讨这个问题,并围绕"代理类"这个关键概念进行讲解...

    Jetty Servlet+ HttpClient 制作的 Java HttpProxy

    【Java HttpProxy实现详解——基于Jetty Servlet与HttpClient】 在Java开发中,有时我们需要创建一个HTTP代理服务器,以便转发客户端的HTTP请求到指定的目标服务器。本文将深入探讨如何使用Jetty Servlet容器和...

    JAVA HTTP反向代理实现过程详解

    反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个...

    Spring boot2X负载均衡和反向代理实现过程解析

    Spring Boot 2.X 负载均衡和反向代理实现过程解析 Spring Boot 2.X 是一个基于 Java 的框架,提供了多种方式来实现负载均衡和反向代理。在这篇文章中,我们将详细介绍如何使用 Spring Boot 2.X 实现负载均衡和反向...

    smiley-sans-v1.1.1.zip

    标题“smiley-sans-v1.1.1.zip”表明这是一个软件更新的压缩包,版本号为v1.1.1,很可能包含了字体资源。标签“font”进一步证实了这一点,意味着这个压缩包里面是与字体相关的文件。 在这个压缩包中,我们可以看到...

    smiley-sans-v1.0.0.zip

    Smiley Sans字体家族以其独特的名字和斜体形式,很可能具有某种微笑或快乐的设计元素,使得在文本中使用时能够传达出轻松愉快的氛围。在设计上,这种字体可能强调了友好的视觉效果,适用于儿童产品、娱乐内容或者...

    loggingproxy:一个简单的代理 Servlet,它转发请求以配置 url。-开源

    Logging Proxy 是一个简单的代理 Servlet,它将其请求转发到一个或多个在 servlet 的 init 参数中配置的服务器,并可选择将请求、响应和标头记录为文件。 它已经在 Tomcat 8 上进行了测试。它不是一个可以在浏览器中...

    Unicode Smiley-crx插件

    **Unicode Smiley-crx插件**是一款专为增强文本输入体验设计的浏览器扩展程序,尤其适合那些喜欢在聊天、邮件或者社交媒体中使用表情符号的用户。这款插件支持多语言,其中包括法语(Français),它使得用户能够...

    charon-spring-boot-starter:以Spring Boot启动器形式的反向代理实现

    Zuul与紧密,Smiley的HTTP代理Servlet很简单,没有高级功能。 Charon是通用的Spring Boot工具。 它已经实现了许多功能,其体系结构提供了添加新功能的简便方法。产品特点高度可配置和可扩展Spring 和支持多请求转发...

    smiley, python 应用程序跟踪程序.zip

    smiley, python 应用程序跟踪程序 smiley----python-应用程序跟踪程序Smiley包括几个运行 python 程序和监视记录和报告的内部细节的子命令。 安装和使用 有关详细信息,请参阅 https://smiley.readthedocs.org

    PHP Smiley-开源

    【PHP Smiley 开源项目详解】 PHP Smiley 是一个开源的PHP库,专门设计用于处理文本中的表情符号,也就是我们常说的“笑脸”。这个库提供了一种高效且便捷的方法,可以将文本中的笑脸代码(例如":)")自动转换为...

    spring boot配置多个请求服务代理的完整步骤

    <groupId>org.mitre.dsmiley.httpproxy</groupId> <artifactId>smiley-http-proxy-servlet</artifactId> <version>1.7 ``` 2. **配置代理Servlet**: 创建一个配置类,如`ProxyServletConfiguration`,该类...

    smiley-angular:小角度分量测试

    $ cd smiley $ sudo npm -g install grunt-cli karma bower $ npm install $ bower install $ grunt watch 最后,在浏览器中打开file:///path/to/smiley/build/index.html 。 祝您黑客愉快! 目的 ngBoilerplate...

    smiley-frowney:显示笑脸的教程

    Diese Seite bei 教程 迪斯(Dieses Projekt)Bearbeiten Um在MakeCode zu bearbeiten中死亡存储库。 öffnehttps //makecode.microbit.org/ klicke auf Importieren和dann auf Importiere URL ...

    Smiley-Face:创建用R绘制的笑脸的动画gif

    anim_save("smiley_face.gif", smile_gif) ``` 这段代码会创建一个持续时间较长的动画,眼睛在1到-1的范围内上下移动,动画平滑地过渡。`ease_aes`函数用来设置动画的缓动效果,这里我们选择线性过渡。最后,`anim_...

Global site tag (gtag.js) - Google Analytics