package com.idega.servlet.filter; import java.io.IOException; import java.util.logging.Logger; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletConfig; 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.HttpSession; import com.idega.idegaweb.IWMainApplication; import com.idega.presentation.IWContext; import com.idega.util.CoreConstants; import com.idega.util.CoreUtil; import com.idega.util.RequestUtil; import com.idega.util.StringUtil; import com.idega.util.expression.ELUtil; /** * * This filter should always be the first filter in the filter chain. It sets * the correct encoding to the request and response that has to be done before * anything is written to the headers or gotten from the request. * * @author <a href="mailto:eiki@idega.is">Eirikur S. Hrafnsson</a> */ public class IWEncodingFilter implements Filter { @Override public void doFilter(ServletRequest myRequest, ServletResponse myResponse, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) myRequest; HttpServletResponse response = (HttpServletResponse) myResponse; IWContext.setCharactersetEncoding(request); setRequestResponseProvider(request, response); String viewStateParam = "javax.faces.ViewState"; String viewStateParamValue = request.getParameter(viewStateParam); if (!StringUtil.isEmpty(viewStateParamValue)) { IWContext iwc = CoreUtil.getIWContext(); if (iwc == null) { iwc = new IWContext(request, response, servletConfig == null ? request.getSession().getServletContext() : servletConfig.getServletContext()); } if (!iwc.isLoggedOn()) { Logger.getLogger(getClass().getName()).info("User is not logged in, not allowing to use param '" + viewStateParam + "'"); String redirectUri = IWMainApplication.getDefaultIWMainApplication().getSettings() .getProperty("view_state_param_redirect_page", CoreConstants.PAGES_URI_PREFIX); if (!StringUtil.isEmpty(redirectUri)) { Logger.getLogger(getClass().getName()).info("Redirecting to '" + redirectUri + "' because of parameter '" + viewStateParam + "' and it's value: " + viewStateParamValue); response.sendRedirect(redirectUri); return; } } } doDetectMobileBrowser(request); chain.doFilter(request, response); } private void doDetectMobileBrowser(HttpServletRequest request) { HttpSession session = request.getSession(false); String pageViewType = request.getParameter(CoreConstants.PARAMETER_PAGE_VIEW_TYPE); if (!StringUtil.isEmpty(pageViewType)) session.setAttribute(CoreConstants.PARAMETER_PAGE_VIEW_TYPE, pageViewType); if (CoreConstants.PAGE_VIEW_TYPE_MOBILE.equals(pageViewType)) return; if (CoreConstants.PAGE_VIEW_TYPE_REGULAR.equals(pageViewType)) return; String userAgent = RequestUtil.getUserAgent(request); if (StringUtil.isEmpty(userAgent)) return; userAgent = userAgent.toLowerCase(); boolean mobileBrowser = userAgent.contains("ios") || userAgent.contains("iphone") || userAgent.contains("ipad") || userAgent.contains("ipod") || userAgent.contains("android"); if (mobileBrowser) session.setAttribute(CoreConstants.PARAMETER_PAGE_VIEW_TYPE, CoreConstants.PAGE_VIEW_TYPE_MOBILE); } private void setRequestResponseProvider(HttpServletRequest request, HttpServletResponse response) { RequestResponseProvider requestProvider = null; try { requestProvider = ELUtil.getInstance().getBean(RequestResponseProvider.class); requestProvider.setRequest(request); requestProvider.setResponse(response); } catch(Exception e) {} } private ServletConfig servletConfig; /* * (non-Javadoc) * * @see javax.servlet.Filter#init(javax.servlet.FilterConfig) */ @Override public void init(FilterConfig config) throws ServletException { if (config instanceof ServletConfig) { servletConfig = (ServletConfig) config; } } /* * (non-Javadoc) * * @see javax.servlet.Filter#destroy() */ @Override public void destroy() { } }