我正在使用struts 2,最近我配置了web.xml
和struts.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并将已接受的解决方案添加到代码中解决了问题。
答案 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>