Introdução ao filtro
O filtro também é chamado de filtro. É a tecnologia mais prática na tecnologia de servlet. Através da tecnologia de filtro, os desenvolvedores da Web interceptam todos os recursos da Web gerenciados por servidores da Web: como JSP, servlet, arquivos de imagem estática ou arquivos HTML estáticos, alcançando assim algumas funções especiais. Por exemplo, implemente algumas funções avançadas, como controle de acesso à permissão no nível de URL, filtragem de vocabulário sensível e compactação de informações de resposta.
É usado principalmente para pré-processamento de solicitações de usuário e também pode pós-processo httpsevletResponse. O processo completo de uso do filtro: filtrar pré-processos solicitações do usuário, entregue a solicitação ao servlet para processamento e gera uma resposta e, finalmente, filtra o pós-processos da resposta do servidor.
Função de filtro
1. Intercepte o httpServletRequest do cliente antes que o httpServletRequest chegue ao servlet. Verifique o httpServletRequest, conforme necessário, e você também pode modificar o cabeçalho e os dados HTTPServletRequest.
2. Interceptar httpServletResponse antes de atingir o cliente. Verifique o HTTPServletResponse, conforme necessário, e você também pode modificar o cabeçalho e os dados HTTPServLeTResponse.
Como usar o filtro para implementar a função de interceptação
Existe um método Dofilter na interface do filtro. Quando o desenvolvedor grava o filtro e configura qual recurso da web interceptar, o servidor da Web chama o método Dofilter do filtro sempre antes de ligar para o método de serviço do recurso da Web. Portanto, escrever código neste método pode alcançar o seguinte objetivo:
1. Deixe um pedaço de código executar antes de chamar o recurso de destino.
2. se deve chamar o recurso de destino (ou seja, permitir que os usuários acessem o recurso da Web).
Quando o servidor da Web chama o método Dofilter, ele passa um objeto de filtragem. O objeto FilterChain é o objeto mais importante na interface do filtro. Ele também fornece um método Dofilter. Os desenvolvedores podem decidir se devem chamar esse método de acordo com suas necessidades. Se esse método for chamado, o servidor da Web chamará o método de serviço do recurso da Web, ou seja, o recurso da Web será acessado; caso contrário, o recurso da Web não será acessado.
Desenvolvimento de filtro duas etapas
Escreva uma classe Java para implementar a interface do filtro e implementar seu método Dofilter.
Use e elementos no arquivo web.xml para registrar a classe de filtro escrita e definir os recursos que ele pode interceptar.
Introdução aos nós de configuração web.xml:
O elemento <Filter-Mapping> é usado para definir o recurso que o filtro é responsável por interceptar. Um filtro intercepta um recurso pode ser especificado de duas maneiras: o nome do servlet e o caminho de solicitação para acesso a recursos.
<ame-name> especifica o nome do servlet interceptado pelo filtro.
<Pispatcher> Especifica a maneira como o recurso interceptado pelo filtro é chamado pelo contêiner do servlet. Pode ser uma solicitação, incluir, encaminhamento e erro, e a solicitação padrão. Os usuários podem definir vários sub-elementos <Dispatcher> para especificar o filtro para interceptar várias maneiras de chamar recursos.
O valor e seu significado que o elemento filho pode definir é o seguinte
Corrente de filtro
Em um aplicativo da Web, vários filtros podem ser desenvolvidos e escritos, que são combinados em uma corrente de filtro.
O servidor da Web decide qual filtro para ligar primeiro de acordo com a ordem em que o filtro é registrado no arquivo web.xml. Quando o método Dofilter do primeiro filtro for chamado, o servidor da Web criará um objeto FilterChain que representa a cadeia do filtro e o passa para o método. No método Dofilter, se o desenvolvedor chamar o método Dofilter do objeto FilterChain, o servidor da Web verificará se ainda existe um filtro no objeto FilterChain. Se houver, o segundo filtro é chamado e, se não houver, o recurso de destino será chamado.
Ciclo de vida do filtro
Public void init (filterConfig filterConfig) lança servletexception; // inicialização
Como o programa de servlet que escrevemos, a criação e destruição do filtro é de responsabilidade do servidor da web. Quando o aplicativo da Web for iniciado, o servidor da Web criará um objeto de instância do filtro e chama seu método init para ler a configuração do web.xml para concluir a função de inicialização do objeto, preparando -se assim para a interceptação para solicitações de usuário subsequentes (o objeto de filtro será criado apenas uma vez e o método init será executado apenas uma vez). Os desenvolvedores podem obter o objeto FilterConfig, representando as informações de configuração do filtro atual através dos parâmetros do método init.
Dofilter de vazio público (solicitação de servletRequest, resposta servletResponse, cadeia de filtragem) lança ioexception, servletexception; // solicitação de interceptação
Este método completa a operação de filtragem real. Quando o cliente solicita acesso ao URL associado ao filtro, o filtro do servlet executará primeiro o método Dofilter. O parâmetro FilterChain é usado para acessar filtros subsequentes.
public void Destroy (); // Destroe
O objeto de filtro residirá na memória após a criação e será destruído quando o aplicativo da Web for removido ou o servidor for interrompido. Chamado antes do contêiner da web desinstala o objeto de filtro. Este método é executado apenas uma vez durante o ciclo de vida do filtro. Neste método, os recursos usados pelo filtro podem ser libertados.
Interface FilterConfig
Ao configurar os filtros, os usuários podem configurar alguns parâmetros de inicialização para filtros. Quando o contêiner da web instancia o objeto de filtro e chama seu método init, ele passa no objeto FilterConfig que encapsula os parâmetros de inicialização do filtro. Portanto, quando os desenvolvedores escrevem filtros, eles podem obter o seguinte conteúdo através do método do objeto FilterConfig:
String getFiltername (); // Obtenha o nome do filtro. String getInitParameter (nome da string); // Retorna o valor do parâmetro de inicialização com o nome especificado na descrição da implantação. Se não houver existência, retorne nulo. Enumeração getInitParameterNames (); // Retorna um conjunto de enumeração de nomes de todos os parâmetros de inicialização do filtro. public servletContext getServletContext (); // Retorna uma referência ao objeto de contexto do servlet.
Casos de uso de filtro
Use o filtro para verificar o controle de segurança de login do usuário
Eu participei da manutenção de um projeto há algum tempo. Depois que o usuário saiu do sistema, ele foi à barra de endereços para acessar o histórico. De acordo com o URL, ele ainda poderia entrar na página de resposta do sistema. Verifiquei e descobri que a solicitação não foi filtrada e verifiquei se o login do usuário foi conectado. Adicione um filtro para resolver o problema!
Primeiro configure -o em web.xml
<filter> <filter-name> sessionfilter </ftrid-name> <filter-class> com.action.login.sessionFilter </filter-class> <itir--param> <amam-name> logons </param-name> <!-não filtre a página de login-> <aMAR-value> /project/index.jsp; <amam-name> incluiestrings </param-name> <!-filtre apenas o sufixo do parâmetro do filtro especificado-> <amam-value> .do; .jsp </param-value> </irit-param> <iir--param> <amam-name> redirectpath </amam-name> <! <init-param> <param-name>disabletestfilter</param-name><!-- Y: Invalid filter--> <param-value>N</param-value><!-- http://www.manongjc.com/article/1613.html --> </init-param></filter><filter-mapping> <filter-name>SessionFilter</filter-name> <url-pattern>/*</url-tattern> </filter-Mapping>
Em seguida, escreva filterServlet.java:
pacote com.action.login; importar java.io.ioException; importar javax.servlet.filter; importar javax.servlet.filterchain; importar javax.servlet.filterConfig; importlestrax.sertlet.sertleTlexception; import javax.sertlestlestlestlestrexest; javax.servlet.http.httpServletRequest; importar javax.servlet.http.httpServletResponse; importar javax.servlet.http.httpServLeSponseWrapper;/*** determinar o sistema de que o usuário está logado e se não for logado http://www.manongjc.com/article/1613.html */public class SessionFilter implementa filtro {public filterConfig config; public void Destroy () {this.config = null; } public static boolean iscontains (contêiner de string, string [] regx) {resultado booleano = false; for (int i = 0; i <regx.length; i ++) {if (container.indexof (regx [i])! = -1) {return true; }} Retornar resultado; } public void Dofilter (Solicitação de servletRequest, resposta servletResponse, cadeia de filtragem) lança IoException, servletexception {httpServletRequest hrequest = (httpServletRequest); HttpServletResponsewrapper wrapper = new httpServletResponseWrapper ((httpServletResponse)); String logons = config.getInitParameter ("Logonstrings"); // Faça login na página de login string Incluirestrings = config.getInitParameter ("includestrings"); // Filtrar parâmetros de sufixo do recurso String redirectPath = hrequest.getContextPath () + config.getInitParameter ("RedirectPath"); // sem login na página de volta string desableTestFilter = config.getInitParameter ("desableTestFilter"); // é o filtro válido se (desableTestFilter.TOUPPERCASE (). Equals ("y")) {// inválido Chain.Dofilter (solicitação, resposta); retornar; } String [] logonList = logons.split (";"); String [] incluíaList = IncdivEstrings.split (";"); if (! this.IScontains (hrequest.getRequesturi (), includeelist)) {// filtre apenas o parâmetro de filtro especificado Chain.Dofilter (solicitação, resposta); retornar; } if (this.ISCONTINS (hrequest.getRequesturi (), logonList)) {// não filtre a cadeia de página de login.dofilter (solicitação, resposta); retornar; } String user = (string) hrequest.getSession (). GetAttribute ("useronly"); // julga se o usuário está conectado a if (user == null) {wrapper.sendRedirect (redirectPath); retornar; } else {Chain.dofilter (solicitação, resposta); retornar; }} public void init (filterConfig filterConfig) lança servletexception {config = filterConfig; }}Dessa forma, todas as solicitações ao usuário podem ser concluídas e o login do usuário deve ser verificado através deste filtro.
Impedir filtros ilegais chineses
Quando o projeto usa a estrutura da mola. Quando diferentes conjuntos de caracteres são usados na página JSP atual e no código Java para codificação, haverá problemas iluminados com os dados enviados do formulário ou o upload/baixando arquivos de nomes chineses. Então você pode usar este filtro.
<filter> <filter-name> codificação </filter-name> <filter-Class> org.springframework.web.filter.characterencodingFilter </filter-class> <iit-param> <amam-name> codificação </param-name> <! <iit-param> <amam-name> forcencoding </param-name> <!-true: Independentemente de a solicitação ter especificado um conjunto de caracteres, a codificação é usada; FALSE: Se a solicitação especificou um conjunto de caracteres, a codificação não será usada-> <amam-value> false </amam-value> </irit-param> </filter> <filter-Mapping> <filter-name> Encoding </filter-Name> <url-pattern>/*</url-pattern> </filter-mapping>
Spring+Hibernate OpenSessionInviewFilter Controla a troca de sessão
Quando o hibernato+mola é usado em conjunto com ele, se preguiçoso = true for definido (carregamento atrasado), ao ler os dados, o Hibernate fechará automaticamente a sessão depois de ler os dados dos pais. Dessa forma, quando você deseja usar os dados associados e os dados da criança, o sistema lançará um erro de lazyinit. No momento, você precisa usar o filtro OpenSessionInViewFilter fornecido pela primavera.
O OpenSessionInViewFilter mantém principalmente o estado da sessão até que a solicitação envie todas as páginas para o cliente e não feche a sessão até que a solicitação seja concluída, de modo a resolver os problemas causados pelo carregamento preguiçoso.
NOTA: A configuração OpenSessionInViewFilter deve ser gravada na frente da configuração do STRUTS2. Como o contêiner do Tomcat é carregado na sequência ao carregar o filtro, se o arquivo de configuração gravar primeiro a configuração do filtro do Struts2 e, em seguida, a configuração do filtro OpenSessionInviewFilter, a ordem de carregamento resulta na sessão não sendo gerenciada pela primavera ao obter dados.
<filter> <!-carregamento preguiçoso habilitado na primavera-> <filtro-name> opensionInviewFilter </filter-name> <filter-Class> org.springframework.orm.hibernate3.support.openssionInviewFilter </filter-class> <iit-param> <amoname> SessionBeaname </paramnname </paramnName </paramnName </paramnName </paramnname </paramnName </paramnname </paramnName </Fillestl> <init-param> <amoname>. Por padrão, o feijão com ID como SessionFactory do recipiente da mola. Se o ID não for de sessão, você precisará configurá -lo da seguinte maneira. Aqui, o SessionFactory é o feijão no recipiente da primavera. -> <amam-value> SessionFactory </amam-value> </irit-param> <iit-param> <amam-name> singlessession </amam-name> <!-Singtlesession Padrates para True, se definido como false, é igual a não usar o OPENSENSIVENVIEW-> <aam-value> </param-value> </inot-s-giram </inot-sam </não é igual a </não é igual a OpensssionInst. <Filter-Name> OpenSessionInViewFilter </filter-Name> <url-tattern>*. do </url-tattern> </filter-mapping>
Configuração Web.xml do STRUTS2
Para usar o STRUTS2 no projeto, você também precisa configurar um filtro no web.xml para interceptar solicitações e ir à ação do Struts2 para o processamento.
Nota: Se na versão Struts2 antes de 2.1.3, o filtro usa org.apache.struts2.dispatcher.filterdispatcher. Caso contrário, use org.apache.struts2.dispatcher.ng.filter.strutsprepareAndExecuteFilter. Começando com o Struts 2.1.3, o filtro ActionContextCleanup será abandonado, enquanto a funcionalidade correspondente é incluída no filtro StrutSPREPAREANDEXECUTEFILTER.
Três parâmetros de inicialização estão configurados:
<!-struts 2.x filtro-> <filter> <filtro-name> struts2 </filter-name> <filter-class> org.apache.struts2.dispatcher.ng.filter.strutsprepareandexecuteFilter </filter-cass> </filter-mapping> <name> struts2 </filter-cass> </filter-mapping> <name> </filter-class> </filter-mapping> <filtroMed> </filter-class> </filter-mapping> </filtelame> </filtername> </filterlame> </filter-mapping> </filterpeandeeNcuteFilter <url-padrão>*. do </url-tattern> </filter-mapping>
Obrigado pela leitura, espero que isso possa ajudá -lo. Obrigado pelo seu apoio a este site!