【问题标题】:Glassfish v4 - java 7 - Port Unification - Error - not able to redirect http to httpsGlassfish v4 - java 7 - 端口统一 - 错误 - 无法将 http 重定向到 https
【发布时间】:2014-08-04 15:17:59
【问题描述】:

我正在尝试使用 glassfish 4 的端口统一将任何 http 请求重定向到 https。我可以使用 V3 轻松做到这一点,但我遇到 glassfish v4 - Java 1.7 的问题。

我在 glassfish v4 中执行的命令 -

asadmin create-protocol --securityenabled=false http-redirect asadmin create-protocol-filter --protocol http-redirect --classname org.glassfish.grizzly.config.portunif.HttpRedirectFilter 重定向过滤器

asadmin create-protocol --securityenabled=false pu-protocol asadmin create-protocol-finder --protocol pu-protocol --targetprotocol http-listener-2 --classname org.glassfish.grizzly.config.portunif.HttpProtocolFinder http-finder asadmin create-protocol-finder --protocol pu-protocol --targetprotocol http-redirect --classname org.glassfish.grizzly.config.portunif.HttpProtocolFinder http-redirect

设置 configs.config.server-config.network-config.network-listeners.network-listener.http-listener-1.protocol=pu-protocol

以上所有命令都执行没有错误。但是,当我尝试访问网络时,它会引发异常并且 http 地址无法启动 - localhost:8080 失败

Glassfish 中的异常 -

警告:FilterChain 执行期间出现异常 java.lang.ClassCastException: org.glassfish.grizzly.memory.HeapMemoryManager$TrimmableHeapBuffer 不能转换为 org.glassfish.grizzly.http.HttpContent 在 org.glassfish.grizzly.config.portunif.HttpRedirectFilter.handleRead(HttpRedirectFilter.java:99) 在 org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119) 在 org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288) 在 org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206) 在 org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136) 在 org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114) 在 org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77) 在 org.glassfish.grizzly.portunif.PUFilter.handleRead(PUFilter.java:231) 在 org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119) 在 org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288) 在 org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206) 在 org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136) 在 org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114) 在 org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77) 在 org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:838) 在 org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113) 在 org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115) 在 org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55) 在 org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135) 在 org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:564) 在 org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:544) 在 java.lang.Thread.run(Thread.java:722)

如果可以解决,不胜感激,有没有其他方法可以将端口从http重定向到https?

【问题讨论】:

    标签: glassfish-4


    【解决方案1】:

    确保您的最后一个命令包含“asadmin”,因为 set 是 DOS 命令。

    当我使用以下命令时,这适用于 GlassFish 4.0(尽管它看起来与您的非常相似):

    asadmin create-protocol --securityenabled=false http-redirect
    
    asadmin create-http-redirect --redirect-port 8181 --secure-redirect true http-redirect
    
    asadmin create-protocol --securityenabled=false pu-protocol
    
    asadmin create-protocol-filter --protocol http-redirect --classname org.glassfish.grizzly.config.portunif.HttpRedirectFilter redirect-filter
    
    asadmin create-protocol-finder --protocol pu-protocol --targetprotocol http-listener-2 --classname org.glassfish.grizzly.config.portunif.HttpProtocolFinder http-finder
    
    asadmin create-protocol-finder --protocol pu-protocol --targetprotocol http-redirect --classname org.glassfish.grizzly.config.portunif.HttpProtocolFinder http-redirect
    
    asadmin set configs.config.server-config.network-config.network-listeners.network-listener.http-listener-1.protocol=pu-protocol
    

    我注意到这会导致 http-listener-1 的 HTTP 选项卡(配置 --> 服务器配置 --> 网络配置 --> 网络监听器 --> http-listener-1 --> SSL 选项卡) 不再显示。对我来说不是问题。

    【讨论】:

    • 感谢回复,我试试看,有没有这方面的文档?这将帮助我理解代码
    • 我可以确认这行得通 - 经过一整天的努力并最终让 HTTPS 正常工作,我省了很多额外的麻烦,谢谢!
    • 多问一个问题,这7条命令怎么取消?
    【解决方案2】:

    所以我不确定为什么,但是当我使用协议名称 pu-protocol 时,它不会正确配置,并且不会显示在协议列表下的管理控制台中。我所要做的就是为协议使用不同的名称,一切正常。我使用了 portunif-protocol 这个名字,当我运行命令来创建它时,它就会出现在 Glassfish 管理控制台的 Protocols 部分下,正如你所期望的那样。现在我已经根据需要将我的网站重定向到 https!

    我使用的命令:

    asadmin create-protocol --securityenabled=false http-redirect
    asadmin create-http-redirect --redirect-port 443 --secure-redirect true http-redirect
    asadmin create-protocol --securityenabled=false portunif-protocol
    asadmin create-protocol-filter --protocol http-redirect --classname org.glassfish.grizzly.config.portunif.HttpRedirectFilter redirect-filter
    asadmin create-protocol-finder --protocol portunif-protocol --targetprotocol http-listener-2 --classname org.glassfish.grizzly.config.portunif.HttpProtocolFinder http-finder
    asadmin create-protocol-finder --protocol portunif-protocol --targetprotocol http-redirect --classname org.glassfish.grizzly.config.portunif.HttpProtocolFinder http-redirect
    asadmin set configs.config.server-config.network-config.network-listeners.network-listener.http-listener-1.protocol=portunif-protocol
    

    希望对可能遇到与我相同的问题的其他人有所帮助。

    【讨论】:

    • 这是个好主意吗?要让 glassfish 甚至接触 1024 以下的端口,它必须以 root 权限运行。
    猜你喜欢
    • 2014-04-18
    • 2018-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-27
    • 2021-01-17
    • 1970-01-01
    相关资源
    最近更新 更多