Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Servlets Servlet+;重定向_Servlets - Fatal编程技术网

Servlets Servlet+;重定向

Servlets Servlet+;重定向,servlets,Servlets,我需要一些建议。我将servlet映射定义为 <servlet-mapping> <servlet-name>My Servlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> 我的Servlet / 但是,存在一些静态html文件。因此,我将它们映射到默认servlet,以服务于静态html文件 <servlet-mapping

我需要一些建议。我将servlet映射定义为

<servlet-mapping>
 <servlet-name>My Servlet</servlet-name>
 <url-pattern>/</url-pattern>
</servlet-mapping>

我的Servlet
/
但是,存在一些静态html文件。因此,我将它们映射到默认servlet,以服务于静态html文件

<servlet-mapping>
 <servlet-name>default</servlet-name>
 <url-pattern>*.html</url-pattern>
</servlet-mapping>

违约
*.html
但是,我希望用户只有在登录后才能访问它们。欢迎页面是Login.html。如果用户试图访问任何其他静态文件,但尚未登录,即没有会话,则我应将用户重定向到登录页面。但是,通过当前映射,用户可以访问index.html文件,因为请求由默认servlet提供


请建议。

您的目的是使用前端控制器servlet,而不是替换默认servlet。因此,实际上不应该在
/
上映射前端控制器servlet

您应该将控制器servlet映射到更具体的URL模式,例如
/app/*
。为了保持URL的透明性,最好的办法是创建一个过滤器,该过滤器确定请求URI,并在静态内容(如HTML)上继续链接,并将剩余内容发送到控制器servlet

例如


您可以扩展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映射到“/”级别


前线控制员
前线控制员
前线控制员
前线控制员
/
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
    }
  }
}
<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>