WebSphere v9环境下Java代码无法获取URL Cookie:连接被拒绝
问题描述
我开发的Java Web应用需要在网页加载时通过Servlet过滤器完成认证:过滤器需从外部站点获取Cookie验证用户权限,进而允许访问我开发的HTML站点。但执行connection.getContent()时抛出错误:
java.net.connectException: Connection refused
该问题仅在Web应用部署到WebSphere运行时出现——将相同的Cookie获取代码放到独立Java主程序中运行,却能正常拿到目标站点的Cookie。目标站点与应用处于同一网络,排除防火墙问题,怀疑是WebSphere配置导致的异常。
环境信息
- IBM WebSphere Application Server v9
- Java 8(工作要求)
- 使用
java.net.*库实现Cookie获取 - 开发工具:Eclipse
示例代码
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { try { CookieManager cookieManager = new CookieManager(); cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL); CookieHandler.setDefault(cookieManager); URL url = new URL("https://somesite.com/"); HttpsURLConnection connection = (HttpsURLConnection) url.openConnection(); connection.getContent(); CookieStore cookies = cookieManager.getCookieStore(); List<HttpCookie> cookieList = cookies.getCookies(); for (HttpCookie cookie : cookieList) { System.out.println("cookie name: " + cookie.getName()); System.out.println("cookie comment: " + cookie.getComment()); System.out.println("cookie doman: " + cookie.getDomain()); System.out.println("cookie value: " + cookie.getValue()); System.out.println("----------------------------------------"); } } catch (Exception e) { e.printStackTrace(); } }
排查与解决建议
1. 检查WebSphere代理配置
WebSphere默认可能启用代理设置,导致出站请求被转发到无效代理服务器:
- 登录WebSphere管理控制台,进入服务器 > 服务器类型 > WebSphere应用服务器 > [你的服务器名称] > 服务器基础结构 > Java和进程管理 > 进程定义 > Java虚拟机 > 自定义属性
- 查看是否存在
http.proxyHost、http.proxyPort、https.proxyHost、https.proxyPort这类代理属性,若配置的代理不可用,可暂时移除后重启服务器测试。
2. 验证出站连接权限
WebSphere的安全策略可能限制应用的出站网络访问:
- 进入安全 > 全局安全 > Java 2安全 > 权限策略,确认应用拥有
java.net.SocketPermission权限,允许连接目标站点https://somesite.com/。可添加对应权限条目:grant codeBase "file:/path/to/your/application.war" { permission java.net.SocketPermission "somesite.com:443", "connect,resolve"; };
3. 检查SSL信任存储配置
WebSphere的SSL信任存储若未包含目标站点证书,可能导致连接失败(错误信息可能被包装为Connection refused):
- 进入安全 > SSL证书和密钥管理 > 密钥存储库 > 信任存储库,检查是否已导入目标站点的SSL证书。若未导入,需导出目标站点证书并添加到WebSphere的信任存储(如
DefaultTrustStore)中。
4. 避免全局CookieHandler冲突
在Web应用中设置CookieHandler.setDefault(cookieManager)可能与WebSphere自身的Cookie管理机制冲突,建议改为局部设置:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { try { CookieManager cookieManager = new CookieManager(); cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL); URL url = new URL("https://somesite.com/"); HttpsURLConnection connection = (HttpsURLConnection) url.openConnection(); connection.setCookieHandler(cookieManager); // 局部设置CookieHandler,不修改全局默认 connection.getContent(); CookieStore cookies = cookieManager.getCookieStore(); List<HttpCookie> cookieList = cookies.getCookies(); for (HttpCookie cookie : cookieList) { System.out.println("cookie name: " + cookie.getName()); System.out.println("cookie comment: " + cookie.getComment()); System.out.println("cookie domain: " + cookie.getDomain()); // 修正原代码拼写错误 System.out.println("cookie value: " + cookie.getValue()); System.out.println("----------------------------------------"); } } catch (Exception e) { e.printStackTrace(); } }
5. 启用出站连接日志排查
开启WebSphere网络连接日志,获取更详细的失败原因:
- 在服务器Java虚拟机自定义属性中添加:
com.ibm.ws.trace.specification=*=info:com.ibm.ws.http.channel*=all:com.ibm.ws.ssl*=all - 重启服务器后查看
SystemOut.log和trace.log,分析连接失败的具体细节。
内容的提问来源于stack exchange,提问作者timJIN520
相关产品推荐
相关产品推荐

