Servlet +重定向

时间:2011-07-11 03:54:51

标签: servlets

我需要一些建议。我已将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提供。

请建议。

2 个答案:

答案 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>