解决Struts2和Servlet的请求冲突

来源:互联网 发布:c语言如何输入随机数 编辑:程序博客网 时间:2024/05/16 19:15

今日开放项目,遇到老程序员用Servlet开发,新程序员用Struts2开发的情况。

开发完成后,需要进行功能集成,但,尝试多次都无法搞定。因为,两者的url-pattern,总是有相互包含的部分,所以,无法正确传递HTTP请求。

最后,突发奇想,也许自己写一个Filter放在最前面,对所有请求进行拦截,如果是Servlet的请求,则内部跳转至Servlet;其他的请求让Struts2来处理。

Filter的代码如下:

package houlei.web.support.context;import java.io.IOException;import java.util.HashSet;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.RequestDispatcher;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletRequest;/** * 解决 Struts2 和 自定义 Servlet 的请求冲突 */public class CustomSevletFilter implements Filter {public static final String PARAM_INCLUDE_SERVLETs = "includeServlets";private static final HashSet<String> ServletPatterns = new HashSet<String>();public void destroy() {ServletPatterns.clear();}public void init(FilterConfig config) throws ServletException {String param = config.getInitParameter(PARAM_INCLUDE_SERVLETs);if (param!=null && param.trim().length()>0) {String patterns[] = param.split("\\s|\\r|\\n|\\,");for (String p : patterns) {if (p.length() > 0) {ServletPatterns.add(p);}}}}public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest)servletRequest;String target = request.getServletPath();if(ServletPatterns.contains(target)){RequestDispatcher rdsp = request.getRequestDispatcher(target);rdsp.forward(servletRequest, servletResponse);// 转发我们的请求,跳出FilterChain}else{filterChain.doFilter(servletRequest, servletResponse);}}}
编写完自定义的Filter之后,将之集成到项目中。

web.xml文件的内容如下:

<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"><filter><filter-name>CustomSevletFilter</filter-name><filter-class>houlei.web.support.context.CustomSevletFilter</filter-class><init-param><param-name>includeServlets</param-name><param-value>/cAppRequest,/cAppReport</param-value></init-param></filter><filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class><init-param><param-name>config</param-name><param-value>struts-default.xml,struts-plugin.xml,../config/struts2.cfg.xml</param-value></init-param></filter><filter-mapping><filter-name>CustomSevletFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern></filter-mapping><servlet><description>app request to server</description><display-name>app request</display-name><servlet-name>cAppRequest</servlet-name><servlet-class>xxx.xxx.CAppRequest</servlet-class></servlet><servlet><servlet-name>cAppReport</servlet-name><servlet-class>xxx.xxx.CAppReport</servlet-class></servlet><servlet-mapping><servlet-name>cAppRequest</servlet-name><url-pattern>/cAppRequest</url-pattern></servlet-mapping><servlet-mapping><servlet-name>cAppReport</servlet-name><url-pattern>/cAppReport</url-pattern></servlet-mapping></web-app>

当然,配置文件仅仅是个样例。朋友们可以根据实际情况进行配置即可。



原创粉丝点击