Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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/user-interface/2.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重写后,所有操作都将转发到Struts2 servlet_Java_Regex_Struts2 - Fatal编程技术网

Java URL重写后,所有操作都将转发到Struts2 servlet

Java URL重写后,所有操作都将转发到Struts2 servlet,java,regex,struts2,Java,Regex,Struts2,我正在使用struts 2,最近我配置了我的web.xml和struts.xml来更改url中的.action。很高兴,除了一个重大问题外,一切都很顺利。 我希望我的一些请求被转发到其他servlet,但是下面的代码确保我的每个操作都被重定向到Struts2 servlet <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dis

我正在使用struts 2,最近我配置了我的
web.xml
struts.xml
来更改url中的
.action
。很高兴,除了一个重大问题外,一切都很顺利。 我希望我的一些请求被转发到其他servlet,但是下面的代码确保我的每个操作都被重定向到Struts2 servlet

<filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
同样地,我也有许多这样的servlet,它们有自己的目的。他们的url模式几乎相同。。。它们类似于/do/abc或/do/pqr等


编辑:通过使用StrutsPrepareAndExecuteFilter并将接受的解决方案添加到代码中来解决问题。

在排除模式中配置URL,如下所示,在struts.xml中。并在web.xml中为/do/*添加servlet映射

<constant name="struts.action.excludePattern" value="/do/.*" />

M.G.Manikandan解决方案更好,我保留这个基于过滤器的解决方案以防万一。想法是在Struts过滤器之上创建一个新过滤器(当您在web.xml上声明它时,必须在Struts过滤器之前)

以及web.xml中的

    <filter>
        <filter-name>CustomFilter</filter-name>
        <filter-class>
            com.mypackage.CustomFilter
        </filter-class>
    </filter>
    <filter-mapping>
        <filter-name>CustomFilter</filter-name>
        <url-pattern>*</url-pattern>
    </filter-mapping>    

自定义过滤器
com.mypackage.CustomFilter
自定义过滤器
*

您试图点击的URL将被定向到struts2。此外,您正在使用一个筛选器,此筛选器声明将侦听所有请求。任何以“/do/”开头的URL。。。更一般地说:“/do/*”为此,我在上面的代码中尝试了一个正则表达式,用^[\/do\/*]代替了/*,但没有完全奏效。我知道/*会将每个url重定向到Struts2 servlet。我想避免这种情况。这就是我的目的。我知道你在那里做了什么。。。很简单,但我不知道是什么原因,这件事不工作。。。它仍然没有处理请求。。。你确定一旦struts排除了一个请求,它就会通过过滤器转发到web服务servlet吗?是的,它会工作。我自己在一个项目中使用了它。它仍然运作良好。你犯了什么错误?URL仍然由struts处理吗?请确切地说,我有一组用于各种目的的过滤器,然后是一组web服务servlet。问题是,所有内容都被转发到struts2,web.xml将其排除在外,然后它将返回到struts.xml,正如您所说的。但是我的请求得到了一个404 for网络错误,这在我看来非常重要,因为请求没有找到一个合适的servlet来提供服务。没有到达servlet代码可能还有其他原因。servlet映射或URL映射的顺序可能错误。请在这里共享web.xml配置。struts也不会处理它。在从URL更改shed.action之前,FilterDispatcher仅处理*.action请求。然后这些请求也得到了处理。这就是为什么我怀疑在排除特定模式后,请求是否会被丢弃,或者是否会被发送回web.xml以找到求婚者?还有一件事。。。我想这门课的目的也是由我来完成的。。我们不能在urlRewrite.xml中添加一两条规则吗?如果需要时链接或转发,可以使用urlRewrite过滤器
    public class CustomFilter implements Filter {
    public void doFilter(ServletRequest req, ServletResponse res,
            FilterChain chain) throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest) req;

        if(request!=null){      
            //optimize this if needed
            if(request.getServletPath().toLowerCase().indexOf("/do/")>-1){                  
                if(!res.isCommitted())
                    request.getRequestDispatcher(request.getServletPath()).forward(request, res);
            } else {            
                chain.doFilter(req, res);
            }
        }
    }       
    public void init(FilterConfig config) throws ServletException {}
    public void destroy() {}      
}
    <filter>
        <filter-name>CustomFilter</filter-name>
        <filter-class>
            com.mypackage.CustomFilter
        </filter-class>
    </filter>
    <filter-mapping>
        <filter-name>CustomFilter</filter-name>
        <url-pattern>*</url-pattern>
    </filter-mapping>