В этом сообщений хочу рассказать как "обойти" проблему с кириллическими названиями отчетов, формируемых в BIPublisher 11g через Mozilla Firefox (проблема наблюдается в версиях 11.1.1.7.1, 11.1.1.6.8).
Причина проблемы в том, что разработчики последних патчей Oracle BIPublisher "забыли", что выгрузка в Firefox аттачей должна отличаться от выгрузки в MSIE.
Надеюсь, в ближайших патчах это будет исправлено. А пока предлагаю следующий воркэраунд.
Решение практически полностью аналогично ранее опубликованному - BIP 11g: кириллица в названиях отчетов + Internet Explorer.
Единственная разница - нужно использовать другой код класса-фильтра:
package oracle.xdo.servlet;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import oracle.apps.fnd.i18n.common.util.MimeUtil;
import java.net.URLDecoder;
public class XxCyrillicFilter1 implements Filter {
protected FilterConfig config;
public void init(FilterConfig config) throws ServletException {
this.config = config;
}
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws ServletException, IOException {
ServletResponse newResponse = response;
if (request instanceof HttpServletRequest) {
String uAgent = ((HttpServletRequest)request).getHeader("User-Agent");
boolean isMSIE = ( uAgent != null && uAgent.indexOf( "IE" ) != -1 );
if (!isMSIE)
newResponse = new XxResponseWrapper1((HttpServletResponse) response);
}
chain.doFilter(request, newResponse);
}
}
class XxResponseWrapper1 extends HttpServletResponseWrapper
{
public XxResponseWrapper1(HttpServletResponse response){
super(response);
}
public void setHeader(String name, String value){
if (!"content-disposition".equalsIgnoreCase(name))
super.setHeader(name, value);
else {
String changedCD;
try {
int endIndexFirstPart = value.indexOf("filename=\"") + 10;
int endIndex = value.indexOf(".");
String badString = value.substring(endIndexFirstPart, endIndex);
badString = URLDecoder.decode(badString,"UTF-8");
badString = MimeUtil.encodeHeader(badString, "UTF-8", "B");
changedCD = value.substring(0, endIndexFirstPart) + badString + value.substring(endIndex);
} catch (UnsupportedEncodingException e) {
changedCD = value;
}
super.setHeader(name, changedCD);
}
}
}
Здесь я дал другое имя классам: XxCyrillicFilter1 и XxResponseWrapper1. А значит в файле web.xml задеплоенного приложения xmlpserver.war нужно ссылаться на класс oracle.xdo.servlet.XxCyrillicFilter1
<filter> <filter-name>XxCyrillicFilter1</filter-name> <filter-class>oracle.xdo.servlet.XxCyrillicFilter1</filter-class> </filter> <filter-mapping> <filter-name>XxCyrillicFilter1</filter-name> <url-pattern>/servlet/xdo</url-pattern> </filter-mapping> <filter-mapping> <filter-name>XxCyrillicFilter1</filter-name> <url-pattern>*.xdo</url-pattern> </filter-mapping>
P.S. Прикладываю файлы скомпилированных классов.
Комментариев нет:
Отправить комментарий