Cannot forward after response has been committed

2 respostas
R

Pessoal estou tendo o seguinte problema no meu filtro de permissoes:

17:37:50,810  INFO SecurityFilter:37 - acesso ao resource negado: /pages/home.jsf
17:37:50,826 ERROR [Faces Servlet]:253 - Servlet.service() for servlet Faces Servlet threw exception
java.lang.IllegalStateException: Cannot forward after response has been committed
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:313)
...
at br.com.peopleway.view.filter.SecurityFilter.doFilter(SecurityFilter.java:41)
...

Nao sei bem porque isso ocorre, e o pior é que so ocorre na primeira chamada da rotina ! as proximas requisicoes da acesso negado e nao redireciona para a pagina de acesso negado
Segue abaixo o codigo, desde já muito obrigado.

public class SecurityFilter implements Filter {
    ...
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
		PersonBO personBO = new PersonBO();
		HttpServletRequest request = (HttpServletRequest)servletRequest; 
		HttpServletResponse response = (HttpServletResponse)servletResponse;
		
		Users user = (Users) request.getSession().getAttribute(Users.KEY);
		String resource = request.getRequestURI().replaceAll(request.getContextPath(), "");
		
		if(personBO.userHasPermissionForResource(user, resource)){
			logger.info("acesso ao resource negado: " + resource);
			response.sendRedirect(DynamicMenu.linkDeniedPermission);
		}
		
		chain.doFilter(request, response);
	}
   ...
}

2 Respostas

Mauricio_Linhares

Esse tipo de coisa acontece quando por algum motivo você já começou a escrever no stream de saída. Será que não tem alguém escrevendo nele aí não?

R

Não achei nada relacionado, nao sei como isso pode estar ocorrendo, isso deveria ocorrer dentro do filtro ou poderia ser em outro lugar ?
Estou usando hibernate+JSF+ajax4jsf

segue abaixo o codigo completo do filtro

public class SecurityFilter implements Filter {
	
	private static final Logger logger = Util.startLogger(SecurityFilter.class);

	public void init(FilterConfig filterConfig) throws ServletException {
	}

	public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
		PersonBO personBO = new PersonBO();
		HttpServletRequest request = (HttpServletRequest)servletRequest; 
		HttpServletResponse response = (HttpServletResponse)servletResponse;
		
		Users user = (Users) request.getSession().getAttribute(Users.KEY);
		String resource = request.getRequestURI().replaceAll(request.getContextPath(), "");
		
		if(!personBO.userHasPermissionForResource(user, resource)){
			logger.info("acesso ao resource negado: " + resource);
			response.sendRedirect(DynamicMenu.linkDeniedPermission);
		}
		
		chain.doFilter(request, response);
	}

	public void destroy() {		
	}

}
Criado 3 de novembro de 2006
Ultima resposta 3 de nov. de 2006
Respostas 2
Participantes 2