如何在Java过滤器中获取HttpResponse.sendredirect跳转的SSO响应?
解决方案:捕获SSO验证地址的响应
当然可行!问题出在HttpResponse.sendRedirect()的工作机制上——它只是给浏览器返回一个跳转指令(3xx状态码+Location头),让浏览器自己去请求SSO地址,所以你的过滤器根本拿不到SSO服务器返回的响应数据。而Postman是直接请求SSO地址,自然能拿到包含SAML的HTML。
要解决这个问题,你需要让你的Java服务器主动发起HTTP请求去调用SSO地址,拿到响应后再转发给浏览器,而不是让浏览器直接跳转。下面是具体的实现方案:
方法1:使用Java 11+自带的HttpClient
这是JDK原生方案,无需额外依赖:
@Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; // 1. 构造你的SSO验证地址,可按需添加RelayState等参数 String ssoAuthUrl = "https://your-sso-server.com/auth"; // 2. 初始化HttpClient,发起GET请求到SSO地址 HttpClient httpClient = HttpClient.newHttpClient(); HttpRequest ssoRequest = HttpRequest.newBuilder() .uri(URI.create(ssoAuthUrl)) .GET() // 传递原请求的Cookie(如果SSO依赖会话识别用户) .header("Cookie", request.getHeader("Cookie")) .build(); // 3. 获取SSO的响应内容 HttpResponse<String> ssoResponse = httpClient.send(ssoRequest, HttpResponse.BodyHandlers.ofString()); // 4. 将SSO返回的HTML写入当前响应,返回给浏览器 response.setContentType("text/html"); response.setCharacterEncoding("UTF-8"); response.getWriter().write(ssoResponse.body()); }
方法2:使用Spring RestTemplate(适用于Spring项目)
如果你的应用是Spring环境,用RestTemplate会更简洁:
@Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; String ssoAuthUrl = "https://your-sso-server.com/auth"; RestTemplate restTemplate = new RestTemplate(); // 可选:配置RestTemplate跟随重定向(默认已开启) restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory()); // 获取SSO响应的HTML String ssoHtmlContent = restTemplate.getForObject(ssoAuthUrl, String.class); // 返回给浏览器 response.setContentType("text/html"); response.setCharacterEncoding("UTF-8"); response.getWriter().write(ssoHtmlContent); }
关键注意事项
- 传递会话信息:如果SSO服务器需要识别用户的现有会话,一定要把原请求的
Cookie头传递过去,否则可能拿到未授权的页面。 - 处理重定向:HttpClient默认会自动跟随3xx重定向,如果你需要手动处理重定向,可以通过
HttpClient.newBuilder().followRedirects(HttpClient.Redirect.NEVER)关闭自动跟随。 - 异常处理:记得捕获
IOException、HttpStatusCodeException等异常,比如SSO服务不可用时,给用户返回友好提示或者执行 fallback 逻辑。
这样修改后,你的服务器就能捕获到SSO地址的响应内容,同时浏览器也能正常加载包含SAML响应的页面,完美替代sendRedirect的跳转方式。
内容的提问来源于stack exchange,提问作者pooja
相关产品推荐
相关产品推荐

