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

时间:2013-06-20 04:55:44

标签: java regex struts2

我正在使用struts 2,最近我配置了web.xmlstruts.xml来更改网址中的消除.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>

我想将我的"/do/*"转发给另一个servlet说xyz然后有人可以帮助我做我应该做的事情。我有一个想法,我可能必须使用正则表达式,但我尝试了很多模式,但失败了。我已经尝试了我认为应该匹配的最好的正则表达式:

[^(\/do\/*)]

    <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>
    <servlet-name>xyzServlet</servlet-name>
    <servlet-class>com.blah.xyzServiceImpl</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>xyzServlet</servlet-name>
    <url-pattern>/do/guide</url-pattern>

同样地,我有许多这样的servlet有自己的目的。 url模式对他们来说几乎相同......他们就像/ do / abc或/ do / pqr等。

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

    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() {}      
}

和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>