5. 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次.
Spring MVC也可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能,自定义的拦截器必须实现HandlerInterceptor接口。
代码如下:
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.Iterator;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class UrlDecodeFilterInterceptor extends AbstractInterceptor {
private static final long serialVersionUID = -2335290125344040914L;
private static final Log LOG = LogFactory.getLog(UrlDecodeFilterInterceptor.class);
public String intercept(ActionInvocation invocation) throws Exception {
Map parameters = invocation.getInvocationContext().getParameters();
HttpServletRequest request = ServletActionContext. getRequest();
if("get".equalsIgnoreCase(request.getMethod())){
for (Iterator i = parameters.keySet().iterator(); i.hasNext();) {
String param = (String) i.next();
String[] values = (String[])parameters.get(param);
if(values != null && values.length > 0){
for (int j = 0; j < values.length; j++) {
if(values[j] != null && !"".equals(values[j])){
try {
values[j] = new String(values[j].getBytes("iso8859-1"),"UTF-8");
parameters.put(param, values[j]);
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
}
}
}
}
}
if("application/x-www-form-urlencoded;charset=UTF-8".equals(request.getContentType())){
for (Iterator i = parameters.keySet().iterator(); i.hasNext();) {
String param = (String) i.next();
String[] values = (String[])parameters.get(param);
if(values != null && values.length > 0){
for (int j = 0; j < values.length; j++) {
if(values[j] != null && !"".equals(values[j])){
try {
values[j] = URLDecoder.decode(values[j], "UTF-8");
parameters.put(param, values[j]);
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
}
}
}
}
}
return invocation.invoke();
}
}
配置文件如
当然,处理编码集可以通过springmvc自带的过滤器进行拦截,只需要在web.xml中配置即
encodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
encodingFilter
/*
public class JspExportFilter implements Filter {
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
//判断导出格式
String type= request.getParameter("t");
//文件名称(解码)
String exportName = URLDecoder.decode(request.getParameter("n"),"UTF-8");
//编码
exportName = URLEncoder.encode(exportName, "UTF-8");
if(exportName == null || exportName.isEmpty()){
exportName = "export";
}
if(type==null){
//null
chain.doFilter(request, response);
return;
}
//使用我们自定义的响应包装器来包装原始的ServletResponse
ResponseWrapper wrapper = new ResponseWrapper((HttpServletResponse)response);
//这句话非常重要,注意看到第二个参数是我们的包装器而不是response
chain.doFilter(request, wrapper);
String result = wrapper.getResult();
HttpServletResponse httpResp = (HttpServletResponse) response;
httpResp.reset();
response.setCharacterEncoding("UTF-8");
httpResp.setContentType("application/download");
ServletOutputStream sos = response.getOutputStream();
try{
if("xls".equals(type)){
//xls
String place="";
result = result.replace("", place);
httpResp.addHeader("Content-Disposition", "attachment;filename="+exportName+".xls");
sos.write(result.getBytes("UTF-8"));
}else if("doc".equals(type)){
//doc
String place="";
result = result.replace("", place);
httpResp.addHeader("Content-Disposition", "attachment;filename="+exportName+".doc");
sos.write(result.getBytes("UTF-8"));
}else if("pdf".equals(type)){
//pdf
httpResp.addHeader("Content-Disposition", "attachment;filename="+exportName+".pdf");
try {
this.htmlCodeComeString(result, response.getOutputStream());
} catch (Exception e) {
BeanLog.getLogger().fatal("pdf export", e);
throw new IOException("pdf export", e);
}
}
}finally{
sos.close();
response.flushBuffer();
}
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
private void htmlCodeComeString(String htmlCode, OutputStream outstream) throws Exception {
Document doc = new Document(PageSize.A4.rotate());
try {
PdfWriter writer =PdfWriter.getInstance(doc, outstream);
ByteArrayInputStream bis = new ByteArrayInputStream(htmlCode.getBytes("UTF-8"));
// 解决中文问题:需要在导出jsp的样式中设置font-family: SimSun。例如:
/*
body{
font-size:12.0px; font-family: SimSun;
}
*/
//jsp必须是xhtml,而且头必须引入
//
doc.open();
XMLWorkerHelper.getInstance().parseXHtml(writer,
doc, bis, Charset.forName("UTF-8"));
doc.close();
bis.close();
}catch(Exception e) {
BeanLog.getLogger().fatal("pdf export", e);
throw e;
}
}
jspExport
com.jbns.easymaster.web.sysmgr.filter.JspExportFilter
jspExport
/export/*