如果路径中有一个页面,比如http://localhost:8080/MyApp/admin/login.xhtml
,当用户键入http://localhost:8080/MyApp/admin/
时,如何将该login.xhtml设置为该文件夹的默认页面?我不希望这个页面出现在欢迎文件列表中,我希望它是这个文件夹的默认页面。
-----编辑-----
正如@joe776所建议的,我试着在admin
文件夹中放一个index.jsp,上面有一个<jsp:forward page="login.xhtml" />
,它很有效,但只是第一次!如果用户再次键入http://localhost:8080/MyApp/admin/
,则会显示错误/admin/paginas/index.xhtml Not Found in ExternalContext as a Resource
,其中paginas
是admin
文件夹中的文件夹。如果用户退出浏览器,请再次打开浏览器,并键入与它工作的URL相同的URL,但只能是第一次。汤姆猫是不是疯了?
一个简单的方法是将index.jsp
放在该文件夹中,并让它重定向到您的login.xhtml
。另一种方法是添加login.xhtml
作为欢迎页面。
Tomcat文档给出了两种可能性的示例:http://wiki.apache.org/tomcat/HowTo#How_do_I_override_the_default_home_page_loaded_by_Tomcat.3F
您可以在web.xml中添加一个安全约束
<security-constraint>
<display-name>Admin</display-name>
<web-resource-collection>
<web-resource-name>Protected</web-resource-name>
<description>Protected Page</description>
<url-pattern>/admin/ *</url-pattern>
</web-resource-collection>
<auth-constraint>
<description/>
<role-name/>
</auth-constraint>
</security-constraint>
所以,每次您尝试访问管理文件夹中的任何内容时,它都会引导您登录页面。
编辑
要重定向到/admin/login.xhtml,可以使用过滤器。以下是jsf过滤器的doFilter方法的示例代码,您可以根据需要进行修改。
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
RequestDispatcher rd;
HttpServletRequest req = (HttpServletRequest) request;
String requestURI = req.getRequestURI();
if (requestURI.equalsIgnoreCase("/index.xhtml")) {
rd = req.getRequestDispatcher("/admin/login.xhtml?faces-redirect=true");
rd.forward(request, response);
}else{
chain.doFilter(request, response);
}
}
正如@jpr所说,我使用了一个Filter重定向到登录页面,唯一奇怪的是,当用户进入"/admin"文件夹时,我需要获取url并再次转发,因为它重定向到了错误的页面,不知道为什么。但我的代码现在看起来是这样的:
@WebFilter({"/admin/paginas/*"})
public class LoginFilter implements Serializable, Filter{
private static final long serialVersionUID = 1L;
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
// HttpServletResponse res = (HttpServletResponse) response;
HttpSession httpSession=req.getSession(true);
Object administradorLogado=httpSession.getAttribute("administrador");
System.out.println("Entrando no loginFileter!");
if (administradorLogado == null) {
RequestDispatcher requestDispatcher = req.getRequestDispatcher("/admin/login.xhtml?faces-redirect=true");
requestDispatcher.forward(request, response);
}else{
String url = ((HttpServletRequest)request).getRequestURL().toString();
System.out.println("URL que peguei no filter admin: "+url);
if(url.endsWith("admin/")){
RequestDispatcher requestDispatcher = req.getRequestDispatcher("/admin/login.xhtml?faces-redirect=true");
requestDispatcher.forward(request, response);
}else{
chain.doFilter(request, response);
}
}
}
@Override
public void destroy() {
}
@Override
public void init(FilterConfig arg0) throws ServletException {
}
}