1

我有一个 JSF/IceFaces3 应用程序正在运行。通过 SSO 登录后,此应用程序应在 Intranet 环境中运行。老板让我给他提供一个他可以调用的链接,例如:

http://companieserver/FancyApplcation/indexsso?name=[用户名]&psw=[用户密码]

作为一个新手,我创建了一个 servlet 并在 web.xml 中提到了它

<servlet>
    <description>SSO Login calling with given Parameters Managed
 AuthenticationService</description>
    <display-name>SsoLogin</display-name>
    <servlet-name>SsoLogin</servlet-name>
    <servlet-class>de.bws.bewerberverwaltung.security.SsoLogin</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>SsoLogin</servlet-name>
    <url-pattern>/indexsso</url-pattern>
  </servlet-mapping>
....

我想从这个 SsoLogin Servlet 重定向到 JSF/IceFaces3 应用程序。这是我的方法:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    FacesContext facesContext = getFacesContext(request, response);
    LoginBean loginBean = (LoginBean)getManagedBean("loginBean", facesContext);

    String login = request.getParameter("name");
    String psw = request.getParameter("psw");

    loginBean.setLogin(login);
    loginBean.setPassword(psw);

    String value = loginBean.login();

    System.out.println("SsoLogin result: " + value);
    request.getRequestDispatcher(value).forward(request, response);
}

来自 loginBean 的值是我项目中的 customeroverview.xhtml 文件。

行为是服务器向我显示了一个白页。当我查看页面的源代码时,它看起来应该是。我还尝试发送具有相同结果的重定向。

也许这不是从 servlet 直接跳转到 JSF 应用程序的最佳方式,但显然它有效。

有什么提示可以解决这个问题吗?

4

1 回答 1

0

JSF 页面应该由FacesServlet. 为了让它运行,请求 URL 必须<url-pattern>FacesServlet. 否则,JSF 组件将不会生成 HTML,并且您最终会得到一个包含一堆 JSF 标记而不是 HTML 元素的浏览器无法理解的响应。

您不想在登录后执行转发,而是执行重定向。所以你绝对应该使用sendRedirect()而不是forward(). 无论您传递给什么 URL sendRedirect(),它都必须<url-pattern>FacesServlet. 如果是例如*.jsf,那么它最终应该是这样的:

response.sendRedirect(request.getContextPath() + "/home.jsf");
于 2013-01-15T11:20:03.150 回答