Este artigo apresenta principalmente o interceptador Springmvc, como segue:
1.dispatcherServlet
A SpringMVC possui um despachoServlet de entrada unificada e todas as solicitações passam pelo DispatcheserServlet.
DispatcheserServlet é um pré-controlador configurado no arquivo web.xml. Para interceptar solicitações correspondentes, as regras de correspondência de interceptação do servlet devem ser definidas por si só, e as solicitações interceptadas devem ser distribuídas ao controlador de destino de acordo com certas regras para processamento. Então, agora adicionamos a seguinte configuração ao web.xml:
<!-Ao inicializar o DispatcheserServlet, a estrutura procura um arquivo chamado [servlet-name] -servlet.xml no diretório Web-Inf do aplicativo da web e define os grãos relevantes lá, substituindo qualquer feijão definido globalmente-> <Verlet> <Verlet-Name> Springmybatis </somerlet-Name> <Verlet-class-class> org.springframework.web.servlet.dispatcherServlet </servlet-class> <adarg-on-startup> 1 </load-on-startup> </servlet> <!-Mapping> <sivet-name> springmybatis </servlet> <!-All Solictor será processado por dispensa por disputa. </servlet-mapping>
2. Recursos estáticos não interceptam
Se você configurar apenas a interceptação de URLs semelhantes ao formato *.do, não há problema em acessar recursos estáticos. No entanto, se a configuração interceptar todas as solicitações (como "/", configuramos acima), causará recursos estáticos, como arquivos JS, arquivos CSS e arquivos de imagem, para ficar inacessível.
Geralmente, o interceptador é implementado principalmente para gerenciamento de permissão, interceptando principalmente algumas solicitações de URL, para que os recursos estáticos não sejam interceptados. Geralmente, existem duas maneiras de filtrar recursos estáticos.
O primeiro é usar <mvc: padrão-servlet-handler /> (geralmente, o nome padrão do servlet do servidor de aplicativos da web é "padrão", então aqui ativamos o padrão do tomcat para processar arquivos estáticos e configurar o seguinte código no web.xml :)
<!- O servlet é fornecido para contêineres como Tomcat, Jetty, etc., e altera o mapeamento de recursos estáticos de / para / static / diretório. Por exemplo, quando você visitou http: //localhost/foo.css, agora http: //localhost/static/foo.css-> <!-Não intercepte arquivos estáticos-> <Verlet-Mapping> <ervlet-name> </irert-name> <url-tattern>/js/js/js/js/** <url-tattern>/css/*</url-tattern> <url-tattern>/imagens/*</url-tattern> <url-tattern>/fonts/*</url-tattern> </servlet-mapping>
Tomcat, Jetty, Jboss e Glassfish o nome do servlet padrão-"padrão"
Resina o nome do servlet padrão --- "resina"
Nome do servlet padrão WebLogic-"FileServlet"
Nome do servlet padrão do WebSphere-"SimpleFileServlet"
Se o nome padrão do servlet de todos os seus servidores de aplicativos da Web não for "padrão", você precisará exibir o especificado através da propriedade Nome de Nome de Serviço Padrão:
<mvc: padrão-servlet-man-handler padrão-servlet-name = "o nome do servlet usado pelo servidor da web por padrão" />
O segundo tipo é usar <mvc: recursos /> e adicione o seguinte código ao arquivo de configuração Springmvc:
<MVC: Recursos Mapping = "/js/**" location = "/static_resources/javascript/"/> <mvc: Recursos Mapping = "/Styles/**" location = "/static_resources/css/"/<mvc: recursos/"/images/**" Location = = "/"/ratic/imagens/imagens/imagens/imagens/imagens/imagens/imagens/css/"/"
3. Interceptor personalizado
O manipulador interceptador do SpringMVC fornece três métodos de pré -mão, pós -endora e pós -conclusão. Prehandle é chamado antes do processador de serviço processar a solicitação,
Posthandle é executado depois que o processador de negócios concluir a execução da solicitação e gera a visualização. O pós -conclusão é chamado após o DispatcheserServlet ter processado completamente a solicitação e pode ser usado para limpar os recursos, etc. Portanto, para implementar sua própria lógica de gerenciamento de permissão, você precisa herdar o HandlerInterCortAdapter e reescrever seus três métodos.
Primeiro, adicione meu próprio interceptador definido ao springmvc.xml. Minha lógica de implementação CommonInterCeptor.
<!-Configurar interceptores, vários interceptores, executar sequencialmente-> <mvc: interceptores> <mvc: interceptor> <!-corresponde ao caminho da URL. Se você não configurar ou/**, todos os controladores serão interceptados-> <mvc: mapeando path = "/user/**"/> <mvc: mapeando path = "/test/**"/> <ean> </bean> </mvc: intercept> <!-Quando a configuração de múltiplos interceptoros, e depois de Method the Proshandle, e o Method Method. Interceptador em ordem inversa -> </mvc: interceptores>
Minha lógica de interceptação é "Antes do login, qualquer URL de acesso saltará para a página de login; depois que o login for bem -sucedido, pule para o URL anterior", o código específico é o seguinte:
/ ** * */ pacote com.alibaba.intercept; importar javax.servlet.http.httpServletRequest; importar javax.servlet.http.httpServletResponse; importar org.slf4j.logger; importar org.slf4j.loggerFactory; importar org.springframework.web.servlet.modelandView; importar org.springframework.web.servlet.handler.HandlerInterceptorAdapter; importação com.alibaba.util.requestutil; / ** * @author tfj * 2014-8-1 */ classe pública CommonInterception estende o HandlerInterceptAdapter {private final Logger log = loggerFactory.getLogger (CommonInterceptor.class); public static final string last_page = "com.alibaba.lastpage"; / * * Use mapeamento regular no caminho que precisa ser interceptado Private String MappingUrl; public void setMappingurl (String mappingurl) {this.mappingurl = mappingurl; } * / / ** * Chamado antes que o processador de negócios lida com a solicitação * se false for retornado * Execute todos os interceptores dos Aftercompletion () do interceptador atual, depois saia da cadeia interceptor * Se true * execute o próximo interceptor até que todos os interceptores sejam executados * Exceutar o PrimeCute do ExoTor (o interceptor mais interceptador, Exuto * Exceto * Exceção PrimeCute * Exceto a execução mais interceptora: PostCompletion () do último interceptador */ @Override Public Boolean Prehandle (solicitação HttPervletRequest, resposta httpServletResponse, manipulador de objetos) lança a exceção {if ("get" .EqualSignorecase (requestmethod ())) {requestutil.SaveCest (); } log.info ("============== 执行顺序: 1 、 prehandle ================="); String requesturi = request.getRequesturi (); String contextpath = request.getContextPath (); String url = requesturi.substring (contextPath.Length ()); log.info ("requesturi:"+requesturi); log.info ("contextPath:"+contextPath); log.info ("url:"+url); String userName = (string) request.getSession (). GetAttribute ("user"); if (nome de usuário == null) {log.info ("Interceptor: salte para a página de login!"); request.getRequestDispatcher ("/web-inf/jsp/login.jsp"). Forward (solicitação, resposta); retornar falso; } else Retorne true; } / *** Depois que o processador de negócios concluir o processamento da solicitação, a ação executada antes da exibição é gerada* Você pode adicionar dados ao ModelAndView, como o horário atual* / @Override public void PostHandle (HTTPServLeTRequest Solicy, HTTPSERVLETRESPONSETIVO, Handler de objetos, ModelAndView) log.info("=========================================================================================================== log.info("========================================================================================== ============================================================================================================= dúvida ==================================================================================================== ============================================================================================================= dúvida Resposta, manipulador de objetos, exceção ex) lança exceção {log.info ("============== 执行顺序: 3 、 Aftercompletion ================"); Nota: No código acima, escrevi um requestutil, que implementa principalmente funções como obter a solicitação atual, objeto de sessão, salvar e criptografar páginas e retirar.
Neste ponto, o interceptador foi implementado e o efeito é como mostrado na figura:
Serei bloqueado visitando /test /olá diretamente
Depois de fazer login com sucesso, ele saltará para a página correspondente a /test /hello
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.