我有一个JSF/IceFaces3应用程序正在运行。通过SSO登录到该应用程序后,该应用程序应该在内部网环境中运行。老板让我给他提供一个链接,他可以这样打电话:
http://companieserver/FancyApplcation/indexsso?name=【用户名】,psw = [userpassword]
作为新手,我创建了一个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应用程序的最佳方式,但显然它是有效的。
有解决这个问题的提示吗?
JSF页面应该由FacesServlet
处理。为了让它运行,请求URL必须匹配FacesServlet
的<url-pattern>
。否则JSF组件将不会生成HTML,并且您最终会得到一个——对浏览器来说——难以理解的响应,其中包含一堆JSF标记而不是HTML元素。
您不希望在登录后执行转发,而是重定向。所以你一定要用sendRedirect()
而不是forward()
。无论您传递给sendRedirect()
的URL是什么,它都必须与FacesServlet
的<url-pattern>
匹配。例如,如果它是*.jsf
,那么它最终应该是这样的:
response.sendRedirect(request.getContextPath() + "/home.jsf");