注意:这些方案中的用户已经拥有一个帐户。 我使用的是Java EE 7:JSF 2.2,GLassfish 4.1和基于From的身份验证。目标:当用户第一次登录(登录)时我想将他重定向到(例如)页面:a.xhtml,这样他就输入了一些信息。之后,每次登录时都会重定向到页面:normal.xhtml而不是a.xhtml。正如您在用户登录后在以下代码中看到的那样,他将始终被重定向到a.xhtml,这就是问题所在:
<security-constraint>
<display-name>securityConstraint1</display-name>
<web-resource-collection>
<web-resource-name>resources</web-resource-name>
<description></description>
<url-pattern>/private/* </url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>Admin</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>FORM</auth-method>
<realm-name>ProjRealm</realm-name>
<form-login-config>
<form-login-page>/login.xhtml</form-login-page>
<form-error-page>/public/pages/forbidden.xhtml</form-error-page>
</form-login-config>
</login-config>
<security-role>
<role-name>Admin</role-name>
</security-role>
<welcome-file-list>
<welcome-file>private/inscription/a.xhtml</welcome-file>
</welcome-file-list>
第二个问题:
当我访问&#34;默认项目页面&#34; :http://localhost:8080/Pro1.0/
服务器想要将我重定向到受保护的a.xhtml,并且由于用户未经过身份验证,服务器会将我重定向到&#34; form-login-page&#34;在web.xml中声明的页面,我的问题是如何使服务器重定向&#34;默认项目页面&#34;到公共页面(任何网站的主页),并在第一个问题中询问时,将用户在经过身份验证后重定向到如normal.xhtml的私有页面。
谢谢,如果您有任何疑问,请点击此处。
更新:感谢Oskars Pakers提供解决方案
这是我的实施: web.xml中:
<welcome-file-list>
<welcome-file>redirect.xhtml</welcome-file>
</welcome-file-list>
redirect.xhtml:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:f="http://xmlns.jcp.org/jsf/core" xmlns:h="http://xmlns.jcp.org/jsf/html">
<f:metadata>
<f:viewAction action="#{redirect.testUser}"></f:viewAction>
</f:metadata>
<h:head>
</h:head>
<h:body>
<h1>TEST Redirect</h1>
</h:body>
</html>
Redirect.java:
@Named
@RequestScoped
public class Redirect extends BaseBacking {
private static final String AAA = "/private/inscription/aaa.xhtml?faces-redirect=true";
private static final String NORMAL = "/private/sections/normal.xhtml?faces-redirect=true";
private static final String HOME = "/home.xhtml?faces-redirect=true";
@EJB
private EJBClass EJBClass;
public String testUser() {
Principal user = getRequest().getUserPrincipal();
if (user == null) {
return HOME;
}
BigInteger Id = /*here I call a EJBClass method so I can decide is it the first time the user login OR NOT*/(user.getName());
if (Id == null) {
return AAA;
} else {
return NORMAL;
}
}
}
答案 0 :(得分:0)
第一个问题
我在这里看到两个选项。
您可以切换到程序化登录,创建自定义jsf页面并执行类似于此的支持bean方法
String login(){ HttpServletRequest request =(HttpServletRequest)FacesContext.getCurrentInstance()。getExternalContext()。getRequest(); request.login(用户名,密码); //检查用户是否在a.xhtml中 返回“a.xhtml”; //或返回“normal.xhtml” }
第二个问题
与问题1类似,如果用户已登录并重定向到其页面,则必须检查公共页面。 正如您使用的是JSF 2.2。你见过
吗?<f:viewAction
标签?它提供了进入页面的方法。如果要重定向用户,可以返回结果。
见f:viewAction