我需要一些建议。我已将servlet映射定义为
<servlet-mapping>
<servlet-name>My Servlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
但是有一些静态的html文件。所以我已将它们映射到默认的servlet以提供静态html文件
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
但是,我希望用户只有在用户登录时才能访问它们。欢迎页面是Login.html。如果用户试图访问任何其他静态文件但尚未登录,即没有会话,那么我应该将用户重定向到登录页面。但是使用当前映射,用户可以访问index.html文件,因为请求由默认servlet提供。
请建议。
答案 0 :(得分:1)
您的意图是拥有一个前端控制器servlet,而不是替换默认的servlet。所以你实际上不应该在/
上映射你的前端控制器servlet。
您应该将控制器servlet映射到更具体的URL模式,例如/app/*
。为了保持URL透明,最好的办法是创建一个过滤器来确定请求URI并继续链接静态内容(如HTML)并将剩余部分分派给控制器servlet。
E.g。
String uri = request.getRequestURI();
if (uri.endsWith(".html")) {
chain.doFilter(request, response);
} else {
request.getRequestDispatcher("/app" + uri).forward(request, response);
}
答案 1 :(得分:0)
您可以扩展Web服务器的DefaultServlet。扩展的servlet将是您的前端控制器。在doGET或doPOST方法中,将静态页面转发到超类。 DefaultServlet是默认情况下映射到url“/”的servlet。我已经将它用于jetty服务器,但它也可以在tomcat中实现。
public class FrontController extends DefaultServlet {
@Override
public void init() throws UnavailableException {
super.init();
}
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
String uri = request.getRequestURI();
/*
* if request is trying to access inside /static then use the default
* servlet. YOU CAN USE YOUR OWN BUSINESS LOGIC TO FORWARD REQUESTS
* TO DEFAULTSERVLET
*/
if (uri.startsWith("/static/")) {
super.doGet(request, response);
return;
} else {
// else use your custom action handlers
}
}
}
在上面的代码示例中,我已将所有以/ static /开头的请求转发到要处理的默认servlet。通过这种方式,您可以将FrontController映射到“/”级别。
<servlet>
<description></description>
<display-name>FrontController</display-name>
<servlet-name>FrontController</servlet-name>
<servlet-class>FrontController</servlet-class>
<servlet-mapping>
<servlet-name>FrontController</servlet-name>
<url-pattern>/</url-pattern>