Servlets Servlet+;重定向
我需要一些建议。我将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-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>