Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/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
Java 排除子目录的筛选器映射url模式_Java_Servlets_Web.xml_Servlet Filters - Fatal编程技术网

Java 排除子目录的筛选器映射url模式

Java 排除子目录的筛选器映射url模式,java,servlets,web.xml,servlet-filters,Java,Servlets,Web.xml,Servlet Filters,有没有办法使filtermapping不包含子目录 比如说 我的上下文根目录中有.xhtml文件,还有一个名为“test”的子文件夹,其中的文件具有相同的扩展名。是否可以将筛选器映射到上下文根目录中的文件而不是“test”目录中的文件?一些容器(如树脂)在web.xml中定义了一个扩展到筛选器映射定义,该定义允许指定允许基于正则表达式匹配url的url regexp。(). 看看你的容器里有没有这样的东西 使用标准servlet/filters可用的方法,无法直接排除子目录,因为*.ext样式映

有没有办法使filtermapping不包含子目录

比如说


我的上下文根目录中有.xhtml文件,还有一个名为“test”的子文件夹,其中的文件具有相同的扩展名。是否可以将筛选器映射到上下文根目录中的文件而不是“test”目录中的文件?

一些容器(如树脂)在web.xml中定义了一个扩展到筛选器映射定义,该定义允许指定允许基于正则表达式匹配url的
url regexp
。(). 看看你的容器里有没有这样的东西

使用标准servlet/filters可用的方法,无法直接排除子目录,因为
*.ext
样式映射包括子目录。您可以通过声明另一个过滤器来解决这个问题,该过滤器专门处理
/test/*.xhtml
映射,并相应地进行处理。

url模式在匹配方面确实是有限制的。它只允许精确、前缀或后缀匹配。中间/整体/正则表达式不匹配。因此,例如,
/*.xhtml
您打算做的事情是行不通的

如果您只想将XHTML排除在
/test
文件夹中,那么您最好的方法就是使用
过滤器
监听
*的
url模式

// First cast ServletRequest to HttpServletRequest.
HttpServletRequest hsr = (HttpServletRequest) request;

// Check if requested resource is not in /test folder.
if (!hsr.getServletPath().startsWith("/test/")) {
    // Not in /test folder. Do your thing here.
}
基本上,从上的上下文路径返回请求URI的一部分


如果需要,您可以将值
/test
配置为筛选器的
,以便可以从
web.xml
内部而不是在筛选器的代码中控制值。

解决方案基本上需要您自己的筛选器类,并将排除URL定义为筛选器的init参数

package test;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginValidationFilter implements Filter {

    private String loginPage = "";
    private List<String> excludedURLs;

    public void init(FilterConfig filterConfig) throws ServletException {
        this.loginPage = filterConfig.getInitParameter("loginPage");

        String[] excluded = filterConfig.getInitParameter("excludedURLs").split(";");
        excludedURLs = new ArrayList<String>();
        for (int i = 0; i < excluded.length; i++) {
            excludedURLs.add(excluded[i]);
        }
    }

    public void destroy() {
        this.loginPage = "";
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException,
            ServletException {

        HttpServletRequest httpRequest = request instanceof HttpServletRequest ? (HttpServletRequest) request : null;
        HttpServletResponse httpResponse = response instanceof HttpServletResponse ? (HttpServletResponse) response
                : null;

        if (httpRequest == null || httpResponse == null) {
            filterChain.doFilter(request, response);
            return;
        }

        boolean isExcludedURL = false;
        for (int i = 0; i < excludedURLs.size(); i++) {
            if (httpRequest.getRequestURL().indexOf(excludedURLs.get(i)) > -1) {
                isExcludedURL = true;
                break;
            }
        }

        if (isExcludedURL) {
            filterChain.doFilter(request, response);
        } else {
            if (UserUtil.validateUserLogin(httpRequest)) {
                filterChain.doFilter(request, response);
            } else {
                httpResponse.sendRedirect(httpRequest.getContextPath() + loginPage);
            }
        }
    }
}
封装测试;
导入java.io.IOException;
导入java.util.ArrayList;
导入java.util.List;
导入javax.servlet.Filter;
导入javax.servlet.FilterChain;
导入javax.servlet.FilterConfig;
导入javax.servlet.ServletException;
导入javax.servlet.ServletRequest;
导入javax.servlet.ServletResponse;
导入javax.servlet.http.HttpServletRequest;
导入javax.servlet.http.HttpServletResponse;
公共类LoginValidationFilter实现筛选器{
私有字符串loginPage=“”;
私人名单不包括杜尔;
public void init(FilterConfig FilterConfig)抛出ServletException{
this.loginPage=filterConfig.getInitParameter(“loginPage”);
String[]excluded=filterConfig.getInitParameter(“excludedURLs”).split(“;”);
excludedURLs=新的ArrayList();
对于(int i=0;i-1){
IsExcludeUrl=真;
打破
}
}
如果(IsExcludeUrl){
filterChain.doFilter(请求、响应);
}否则{
if(UserUtil.validateUserLogin(httpRequest)){
filterChain.doFilter(请求、响应);
}否则{
httpResponse.sendRedirect(httpRequest.getContextPath()+loginPage);
}
}
}
}
并在web.xml中定义过滤器、映射和排除URL

<filter>
    <filter-name>LoginValidationFilter</filter-name>
    <filter-class>test.LoginValidationFilter</filter-class>
    <init-param>
        <param-name>loginPage</param-name>
        <param-value>/login.jsp</param-value>
    </init-param>
    <init-param>
        <param-name>excludedURLs</param-name>
        <param-value>/admin/;/assets/;/content/;/css/;/js/;/login.jsp;/login.cmd;/logout.cmd;forgot_password.jsp;pageName=</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>LoginValidationFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

LoginValidationFilter
test.LoginValidationFilter
登录页
/login.jsp
不包括杜尔斯
/行政//资产//内容//css//js//login.jsp/login.cmd/logout.cmd;忘记密码.jsp;页码=
LoginValidationFilter
/*

您可以为上下文根目录中的每个文件添加url映射值,因此筛选器将应用于这些文件,但不会应用于测试文件夹中的文件(实际上,它只应用于那些特定文件)。以下几点对我有用

<url-pattern>/index.faces</url-pattern>
/index.faces

但是带有mapping/*的过滤器仍然会包含/test下的所有内容,不是吗?这是正确的。我认为第一个匹配的是使用的,但事实并非如此。相反,您可以在您的过滤器中添加url正则表达式检查-如果它与正则表达式匹配,那么过滤器将在委托给Remining过滤器链之前执行其工作。如果正则表达式不匹配,只需将其委托给过滤器链,而不做任何工作。我首先想到的是过滤器中的硬编码?但是init参数是智能的。我在这里学到了一些东西。对不起,这是我的第一篇文章,我花了大约30分钟来纠正格式。解决方案是,基本上您需要自己的过滤器类,并将排除URL定义为过滤器的init param。