Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

PROBLEMA DE ENCODING NO CABEÇALHO

Boa Tarde, estou com um problema chato, no meu cabeçalho que é chamado pelo "PageTemplate", parece que o encoding não funciona no cabeçalho:

CABEÇALHO------------------------------

<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>  
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>   
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> 
<%@ taglib uri="http://www.springframework.org/security/tags" prefix="security" %>                    <!-- Spring Security -->


    <!-- CRIA BARRA DE NAVEGA��O NO TOPO DA P�GINA (COMO UM CABE�ALHO) -->
    <nav class="navbar navbar-inverse">
      <div class="container">
        <div class="navbar-header">
          <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
            <span class="sr-only">Toggle navigation</span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
          </button>
          <a class="navbar-brand" href="${s:mvcUrl('HC#index').build()}">TELA INICIAL - AÇÃO</a>
        </div>
        <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">

          <ul class="nav navbar-nav">
                    <!-- PARTE DO MEIO DA BARRA DE NAVEGAÇÃO -->
                    <li><a href="${s:mvcUrl('EAC#indexAvariados').build()}">Nova Entrada</a></li>
          </ul>


          <ul class="nav navbar-nav navbar-right">
               <li><a href="${s:mvcUrl('CC#telaConfig').build()}">CONFIG</a></li>        <!-- PARTE DA DIREITA DA BARRA DE NAVEGA��O -->                     
          </ul>  

          <!-- MOSTRA QUEM ESTÁ LOGADO E O BOTÃO DE LOGOUT -->
          <security:authorize access="isAuthenticated()">
                   <li><a href="#">                                                                        <!-- Criando um link falso(só para mostrar) -->
                      <security:authentication property="principal" var="usuario" />                            <!--security:authentication property="principal.username"                         Aqui vai mostrar o usuário Logado, "principal" = Uma descrição padrão de todos os FRAMEWORK de SECURITY para indicar o USUÁRIO PRINCIPAL -->
                      Login: ${usuario.nome}              
                  </a></li>
          <!-- UM BOTÃO DE LINK, FEITO PARA LOGOUT (Leva para a URL logout" que é reconhecida pelo SecutiyConfiguration --> 
                <li>
                    <a href='<c:url value="/logout" />'>Logout</a>
                </li>
             </security:authorize> 


        </div><!-- /.navbar-collapse -->
      </div>
    </nav>

PAGE TEMPLATE --------------------------------

<%@ tag language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<!-- Guarda atributos que serão utilizados nesse template enviados -->
<%@ attribute name="titulo" required="true"%>
<%@ attribute name="extraScripts" fragment="true"%>

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8" />
    <meta http-equiv="Content-Type" content="IE=edge,chrome=1">
    <title>${titulo} - Gigor Planilhas</title>

    <!-- Import do BOOTSTRAP -->
    <c:url value="/resources/css" var="cssPath" />
    <c:url value="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js" var="javaScript"/>
    <script type="text/javascript" src="${javaScript}" ></script>
    <link rel="stylesheet" href="${cssPath}/bootstrap.min.css" />
    <link rel="stylesheet" href="${cssPath}/bootstrap-theme.min.css" />

    <style type="text/css">
        a.navbar-brand {
            float: left;
            height: 50px;
            padding: 15px 15px;
            font-size: 18px;
            line-height: 20px;
        }

        select.form-control {
            width: 18%
        }

        input#quantidadeTotal.form-control{
            width: 23%
        }

        input#dataVencimento.form-control{
            width: 23%
        }

    </style>

</head>
<body>


    <!-- Importa para esse TEMPLATE O CABEÇALHO/RODAPE E O CORPO -->
    <!-- Corpo = Todo o código das JSP que estão entre tags:pageTemplate  -->
    <%@ include file="/WEB-INF/views/cabecalho.jsp" %>

        <jsp:doBody />

    <%@ include file="/WEB-INF/views/rodape.jsp" %>    


    <jsp:invoke fragment="extraScripts"/>

</body>
</html>

As configurações do SPRING X SPRING SECURITY

SPRING SERVLET

@Override
    protected Filter[] getServletFilters() {

        CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();                        // Define o encoding do PROJETO
        encodingFilter.setEncoding("UTF-8");

        return new Filter[] {encodingFilter};                                                        // Local de todos os filtros utilizados no PROJETO
    }

SPRING SECURITY -------------------------

package br.com.conf;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpMethod;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.annotation.web.servlet.configuration.EnableWebMvcSecurity;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.web.csrf.CsrfFilter;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
import org.springframework.web.filter.CharacterEncodingFilter;

import br.com.dao.UsuarioDAO;

@EnableWebMvcSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter{

    @Autowired
    private UsuarioDAO usuarioDao;


    @Override
    protected void configure(HttpSecurity http) throws Exception {

        // FORÇANDO O ENCODING, JÁ QUE ESTÁ UTILIZANDO O "SpringSecurity", OBS: depois no "http" add o ".addFilterBefore(filter, CsrfFilter.class);    "
        CharacterEncodingFilter filter = new CharacterEncodingFilter(); 
        filter.setEncoding("UTF-8"); 
        filter.setForceEncoding(true); 


        // LOCAL DAS PERMISSÕES E TELA DE LOGIN/LOGOUT
        http
        .authorizeRequests()
            .antMatchers("/").permitAll()
            .antMatchers("/popula").permitAll()
            .antMatchers("/conf").hasRole("ADMIN")
            .antMatchers("/entradaAvariados", "/entradaAvariados/**" ).hasRole("ADMIN")
            .antMatchers("/fornecedores").hasRole("ADMIN")
            .antMatchers("/empresas", "/empresas/**").hasRole("ADMIN")
            .antMatchers("/produtoPorFornecedor/remover**").hasRole("ADMIN")

            .antMatchers("/fornecedores/**").hasAnyRole("ADMIN" , "PADRAO")
            .antMatchers("/produto**").hasAnyRole("ADMIN", "PADRAO")
            .antMatchers("/produtoPorFornecedor**" , "/produtoPorFornecedor/lista/**").hasAnyRole("ADMIN" , "PADRAO")

            .antMatchers(HttpMethod.POST, "/fornecedores/lista**").denyAll()
            .anyRequest().authenticated()
            .and()

        .formLogin()
            .loginPage("/login").permitAll()
            .and()

        .logout().logoutRequestMatcher(new AntPathRequestMatcher("/logout")).logoutSuccessUrl("/")            
            .and()

        .exceptionHandling().accessDeniedPage("/falha")
            .and()

        .addFilterBefore(filter, CsrfFilter.class);    

        /**
         *     -> [OBSERVAÇÕES]
         *         * hasRole() = No banco de dandos tem na tabela ROLE e USUARIO_ROLE, tem que salvar "ROLE_NomeDaPermissao"
         * 
         *         1> exceptionHandling().accessDeniedPage("/falha") = Modifica a página que leva para o "Acesso não permitido" (ERRO 403), aqui é posto o REQUESTMAPPING (HomeController)
         *        2> hasAnyRole = Cabe mais de 1 ROLE 
         *         3> logoutSuccessUrl("/") = Caso o logout seja efetuado com sucesso, será encaminhado para o REQUESTMAPPING "/"
         * 
         */

//        super.configure(http);                                                            // POR PADRÃO ESSE MÉTODO HERDADO(SUPER) libera todos os acessos
    }


    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {

        // A classe passada aqui é preciso IMPLEMENTS "UserDetailsService"
        auth.userDetailsService(usuarioDao)
                .passwordEncoder(new BCryptPasswordEncoder());

    }


    /* 
     * Na sua classe de configuração do Spring Security, 
     * você precisa liberar o acesso à pasta de arquivos estáticos. 
     * 
     * Para que o SPRING consiga pegar os arquivos CSS, e não seja blequado pela segurança
     */
    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/resources/**");

        // OBS: Poderia add no primeiro conf: .antMatchers("/resources/**") (TALVEZ)
    }

}

Já tentei diversas configurações e até o FILTER do XML, mas não consigo fazer que o ENCODING do cabeçalho leia os caracteres especiais corretamente, alguém teria alguma idéia ?

3 respostas

Frank, tudo bem ?

Tenta colocar isso nas páginas :

<%@ tag language="java" pageEncoding="UTF-8"%>

E outra coisa que acho que não faz muito sentido é você estar criando um outro filter na configuração do spring security. Receio que isso não seja necessário, já que você já faz isso na configuração do spring.

Então, Matheus Brandino, essa repetição no SPRING SECURITY, é devido que, ao aplicar o SPRING SECURITY no meu projeto, ele estava GRAVANDO NO MEU BANCO DE DADOS, os textos com caracteres especiais com o ENCODING errado, e para não precisar colocar em cada "form" que levava para um "persist" o código: "accept-charset="iso-8859-1,utf-8", pesqueisei e vi que fazendo de tal forma, resolveria, agora... se está criado no SPRING SECURITY, eu poderia apagar do SPRING SERVLET MVC ?

solução!

Fala Frank, tudo bem ?

Tente fazer o seguinte. Na classe de registro do filtro de segurança, que estende de AbstractSecurityWebApplicationInitializer (não a com as configurações de segurança que estende de WebSecurityConfigurerAdapter) sobrescreva este método registrando o filtro.

public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer {

    @Override
    protected void beforeSpringSecurityFilterChain(ServletContext servletContext) {
        FilterRegistration.Dynamic characterEncodingFilter = servletContext.addFilter("encodingFilter", new CharacterEncodingFilter());
        characterEncodingFilter.setInitParameter("encoding", "UTF-8");
        characterEncodingFilter.setInitParameter("forceEncoding", "true");
        characterEncodingFilter.addMappingForUrlPatterns(null, false, "/*");
    }
}