/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.web.portal; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.enonic.cms.framework.util.UrlPathEncoder; import com.enonic.cms.core.SiteURLResolver; import com.enonic.cms.core.structure.SiteKey; @Component public class SiteRedirectHelper { private PortalSitePathResolver sitePathResolver; private SiteURLResolver siteURLResolver; @Autowired public void setSitePathResolver( PortalSitePathResolver value ) { this.sitePathResolver = value; } @Autowired public void setSiteURLResolver( SiteURLResolver value ) { this.siteURLResolver = value; } public void sendRedirectWithAbsoluteURL( HttpServletResponse response, String absoluteURL ) { String encodedUrl = UrlPathEncoder.encodeURL( absoluteURL ); doSendRedirect( response, encodedUrl ); } public void sendRedirectWithPath( HttpServletRequest request, HttpServletResponse response, String path ) { String url = doGetFullPathForRedirect( request, path ); doSendRedirect( response, url ); } public void sendRedirect( HttpServletRequest request, HttpServletResponse response, String path ) { String url = stripIllegalChars(path); if ( isAbsoluteUrl( url ) ) { url = UrlPathEncoder.encodeURL( url ); } else { url = doGetFullPathForRedirect( request, url ); } doSendRedirect( response, url ); } private String doGetFullPathForRedirect( HttpServletRequest request, String path ) { SiteKey siteKey = sitePathResolver.resolveSiteKey( request ); return siteURLResolver.createFullPathForRedirect( request, siteKey, path ); } private boolean isAbsoluteUrl( String path ) { return path.matches( "^[a-z]{3,6}://.+" ); } private void doSendRedirect( HttpServletResponse response, String url ) { final String location = response.encodeRedirectURL( url ); response.setStatus( HttpServletResponse.SC_MOVED_TEMPORARILY ); response.setHeader( "Location", location ); } private String stripIllegalChars( final String input ) { StringBuilder sb = new StringBuilder(); for ( int i = 0; i < input.length(); i++ ) { final char c = input.charAt( i ); if ( c >= 0x20 ) { sb.append( c ); } } return sb.toString(); } }