В этом сообщений хочу рассказать как "обойти" проблему с кириллическими названиями отчетов, формируемых в 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. Прикладываю файлы скомпилированных классов.
Комментариев нет:
Отправить комментарий