解决Struts2和Servlet的请求冲突

今日开放项目,遇到老程序员用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>

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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值