背景: 因项目需要,又不想用servlet实现不同项目之前的接口调用.
首先在struts2.xml加入监听器监听的后缀
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts> <constant name="struts.action.extension" value="test" />
<include file="struts/struts-test.xml" />
</struts>
struts/struts-test.xml配置如下
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="test" extends="struts-default" namespace="/policyApply">
<action name="testMethod" class="testAction" method="testMethod" ></action>
<action name="testResponse" class="testAction" method="testResponse" ></action>
</package>
</struts>
配置监听器如下
<filter>
<filter-name>testResponseFilter</filter-name>
<filter-class>com.testResponseFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>testResponseFilter</filter-name>
<url-pattern>/testResponse.*</url-pattern>
</filter-mapping>
<filter>
<filter-name>testFilter</filter-name>
<filter-class>com.testFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>testFilter</filter-name>
<url-pattern>*.test</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.test</url-pattern>
</filter-mapping>
监听请求后缀为.test的请求
testFilter配置如下
package com.sinosoft.intf.reapply.filter;
import com.sinosoft.intf.common.HttpManagerUtil;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
/**
* 自定义前端请求过滤器监听请求,将json格式请求转化为对应VO
*/
public class ReApplyFilter implements Filter {
public final Log logger = LogFactory.getLog(Filter.class);
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// 解析请求的json数据
StringBuffer url = ((HttpServletRequest) servletRequest).getRequestURL();
if (url == null || StringUtils.isBlank(url.toString())){
filterChain.doFilter(servletRequest, servletResponse);
}else {
String[] urlSplits = url.toString().split("/");
String serverName = urlSplits[urlSplits.length - 1];
if (serverName.startsWith("reApplyResponse")){
// 设置响应编码格式
servletResponse.setContentType("text/json;charset=UTF-8");
// servletResponse.getWriter().write(servletRequest.getParameter("responseData"));
}else {
servletRequest.getContentType();
servletRequest.setCharacterEncoding("UTF-8");
String jsonData = HttpManagerUtil.getInstance().getRequestForUTF((HttpServletRequest)servletRequest);
servletRequest.setAttribute("JSONBODY", jsonData);
filterChain.doFilter(servletRequest, servletResponse);
}
}
}
}
配置好后可以正常接收前台调用