Portlet Application redirection from within Filter

I need to redirect to a view/alias from a Filter based on a value in the Session. Logic wise, I know I am able to check the
Session value and get to the redirect logic. The issue is that the would-be redirect is leaving half the ‘original’ page rendered
and the url in browser doesn’t change to the redirected page. (Thus, all that is happening is a halt of rendering the current page).

It seems events/actions/filter may be very different because we using a Portlet Application & not a Web Application. We are having trouble
intercepting a point early enough in the http/jsf process that will allow us to successfully redirect.

We are using jsr176 (no Portlet Filters). Are Filters the correct way to do this?

class SessionFilter implements javax.servlet.Filter
{
	....
	public void doFilter(ServletRequest servletRequest,ServerResponse servletResponse, FilterChain chain) 
	{
		HttpServletRequest request = (HttpServletRequest) servletRequest;
		HttpServletResponse response = (HttpServletResponse) servletResponse;
	
		String redirectTarget = "/target.page";
		String requestURI = request.getRequestURI().toLowerCase();
		boolean shouldRedirect = !CheckUserHasDoneImportantAction();
		
		if (requestURI.contains("target.page")	{ chain.doFilter(request,response); return; }
		if (shouldRedirect)						{ responses.sendRedirect( redirectTarget ); return; }
		else									{ chain.doFilter(request,response); return; }
	}
	....
}

// → web.xml


	<filter>
		<description>Session Filter controls login & consent.</description>
		<filter-name>SessionFilter</filter-name>
		<filter-class>com.test.SessionFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>SessionFilter</filter-name>
		<url-pattern>*</url-pattern>
		<dispatcher>REQUEST</dispatcher>
		<dispatcher>FORWARD</dispatcher>
		<dispatcher>INCLUDE</dispatcher>
		<dispatcher>ERROR</dispatcher>
	</filter-mapping>

Any help welcome!

You won’t be able to reliably redirect from a portlet render request since the response would typically already be partially written when it gets to you.

So you would either have to change the link to be a portlet action request where it would be safe to redirect from your portlet action handler or write some script block in the portlet output that does a client-side redirect via javascript when your condition for doing a redirect is satisfied.

For example:

window.location.href = '/target.page';