我正在使用以下堆栈:
我有一个耳朵项目。
然后我创建了一个简单的Web过滤器来检查用户的角色:
@WebFilter(urlPatterns = MemberProtectionFilter.REALM_BASE_URI + "/*")
public class MemberProtectionFilter implements Filter {
public static final String REALM_BASE_URI = "/pages/member";
@Inject
private Instance<Identity> identityInstance;
@Inject
private Identity identity;
private Identity getIdentity() {
return this.identityInstance.get();
}
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
boolean isAuthorized = identity.isLoggedIn();
PicketlinkAccount account = (PicketlinkAccount) getIdentity()
.getAccount();
if (isAuthorized && account != null
&& account.getUser().hasRole("member")) {
chain.doFilter(httpRequest, httpResponse);
} else {
forwardAccessDeniedPage(httpRequest, httpResponse);
}
}
}
我在没有问题的情况下将它部署在wildfly上。
现在我希望我的应用程序部署在根上下文/上。所以我删除了wildfly管理界面中的welcome-content,并将ear项目pom.xml webModule的定义更改为:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-ear-plugin</artifactId>
<version>${version.ear.plugin}</version>
<configuration>
<version>6</version>
<defaultLibBundleDir>lib</defaultLibBundleDir>
<modules>
<webModule>
<groupId>com.czetsuya</groupId>
<artifactId>picketlink-web</artifactId>
<contextRoot>/</contextRoot>
</webModule>
</modules>
<fileNameMapping>no-version</fileNameMapping>
</configuration>
</plugin>
此次登录后,虽然正确注入了标识,但identity.isLoggedIn()始终被评估为false。此外,我在登录后和过滤器中检查了身份的hashCode,它们是相同的。所以它是同一个实例,但为什么要在WebFilter中注销?此外,当我转到没有过滤器的另一个页面时,identity.isLoggedIn()再次为真。
我正在使用localhost,因此根上下文为http://localhost:8080/
有什么想法吗?
答案 0 :(得分:0)
我能够解决这个问题,但并没有真正找到真正的原因。解决方案是将耳朵部署在另一台服务器上,并使用openhift等公共IP。