Este artículo presenta principalmente el Interceptor SpringMVC, como sigue:
1.Dispatcherservlet
SpringMVC tiene una entrada unificada despachadores, y todas las solicitudes pasan a través de Dispatcherservlet.
DispatcherServlet es un pre-controlador configurado en el archivo web.xml. Para interceptar las solicitudes de coincidencia, las reglas de coincidencia de Intercept de servlet deben definirse por sí solo, y las solicitudes interceptadas se distribuirán al controlador objetivo de acuerdo con ciertas reglas para el procesamiento. Así que ahora agregamos la siguiente configuración a Web.xml:
< <Servlet-class> org.springframework.web.servlet.dispatcherservlet </servlet-class> <load-on-startup> 1 </load-on-startup> </servlet> <ervlet-mapping> <ervlet-name> springMyBatise </servlet-name> <! </Servlet-mapping>
2. Los recursos estáticos no se interceptan
Si solo configura la intercepción de URL similar al formato *.do, no hay ningún problema para acceder a los recursos estáticos. Sin embargo, si la configuración intercepta todas las solicitudes (como "/" que nos configuramos anteriormente), causará inaccesibles recursos estáticos como archivos JS, archivos CSS y archivos de imagen.
En general, el interceptor se implementa principalmente para la gestión de permisos, principalmente interceptando algunas solicitudes de URL, por lo que no se interceptan los recursos estáticos. Generalmente hay dos formas de filtrar recursos estáticos.
El primero es usar <mvc: default-servlet-handler /> (generalmente, el nombre de servlet predeterminado del servidor de aplicaciones web es "predeterminado", por lo que aquí activamos el servicio predeterminado de Tomcat para procesar archivos estáticos y configurar el siguiente código en Web.xml :)
< Por ejemplo, cuando visitó http: //localhost/foo.css, ahora http: //localhost/static/foo.css-> <!-no intercepten archivos estáticos-> <servlet-mapping> <ervlet-name> default </servlet-name-name> <url-pattern>/js/*</sl-pattern> <Url-Pattern>/css/*</ url-Pattern> <url-pattern>/images/*</url-Pattern> <url-pattern>/fonts/*</url-Pattern> </servlet-mapping>
Tomcat, muelle, jboss y peces de vidrio el nombre del servlet predeterminado-"predeterminado"
Resin el nombre del servlet predeterminado --- "File de resina"
Nombre de servlet predeterminado de WebLogic-"FileServlet"
Nombre de servlet predeterminado de WebSphere-"SimpleFileservlet"
Si el nombre de servlet predeterminado de todos sus servidores de aplicaciones web no es "predeterminado", debe mostrar el especificado a través de la propiedad de nombre de servicio predeterminado:
<mvc: default-servlet-handler default-servlet-name = "El nombre de servlet utilizado por el servidor web por defecto" />
El segundo tipo es usar <mvc: recursos /> y agregar el siguiente código al archivo de configuración de SpringMVC:
<mvc: recursos mapping = "/js/**" ubicación = "/static_resources/javascript/"/> <mvc: mapping de recursos = "/styles/**" ubicación = "/static_resources/css/"/> <mvc: mapping de recursos = "/imágenes/**" ubicación = "/static_resources/imágenes/"/"
3. Interceptor personalizado
El interceptor de SpringMVC HandlerInterceptorAdapter proporciona tres métodos previos a la mano, posterior y posterior. Se llama a PreHandle antes de que el procesador de servicio procese la solicitud,
Postthandle se ejecuta después de que el procesador comercial completa la ejecución de la solicitud y genera la vista. Se llama a AfterComppletion después de que el despachador de servicios ha procesado por completo la solicitud y se puede utilizar para limpiar los recursos, etc. Por lo tanto, para implementar su propia lógica de gestión de permisos, debe heredar HandlerinterCepteRAdapter y reescribir sus tres métodos.
Primero, agregue mi propio interceptor definido a SpringMVC.XML. Mi lógica de implementación Compromeptor.
< If you do not configure or /**, all Controllers will be intercepted --> <mvc:mapping path="/user/**" /> <mvc:mapping path="/test/**" /> <bean></bean> </mvc:interceptor> <!-- When setting up multiple interceptors, first call the preHandle method in sequence, and then call the postHandle and afterCompletion methods of each interceptor En orden inverso -> </MVC: Interceptores>
Mi lógica de intercepción es "Antes de iniciar sesión, cualquier URL de acceso saltará a la página de inicio de sesión; después de que el inicio de sesión sea exitoso, salte a la URL anterior", el código específico es el siguiente:
/ ** * */ paquete com.alibaba.interceptor; import javax.servlet.http.httpservletRequest; import 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; import com.alibaba.util.requestutil; / ** * @author tfj * 2014-8-1 */ public class Commoninterceptor extiende HandlerInterceptorAdapter {private final Logger log = loggerFactory.getLogger (CommonInterceptor.class); Public static final cadena last_page = "com.alibaba.lastpage"; / * * Use la asignación regular a la ruta que necesita ser interceptada MappingUrl de cadena privada; public void setMappingUrl (string mappingUrl) {this.mappingUrl = mappingUrl; } * / / ** * llamado antes del procesador empresarial maneja la solicitud * Si se devuelve el falso * Ejecute todos los interceptores AfterCompletion () del interceptor actual, luego salga de la cadena de interceptor * si verdadero * Ejecutar el siguiente interceptor hasta que todos los interceptores se hayan ejecutado * Ejecutar el controlador del interceptor * luego ingrese a la cadena de interceptores, * ejecutar todo posthandle () desde el último interceptor *. PostCompletion () desde el último interceptor */ @Override public Boolean PreHandle (httpservletRequest, respuesta httpServletResponse, Handler de objetos) lanza la excepción {if ("get". } log.info ("============== 执行顺序: 1 、 PreHandle ================="); Cadena requesturi = request.getRequesturi (); String contextPath = request.getContextPath (); Cadena url = requesturi.substring (contextPath.length ()); log.info ("requesturi:"+requestUri); log.info ("contextpath:"+contextpath); log.info ("url:"+url); String username = (string) request.getSession (). GetAttribute ("usuario"); if (username == null) {log.info ("Interceptor: ¡salta a la página de inicio de sesión!"); request.getRequestDIsPatcher ("/web-inf/jsp/login.jsp"). Foring (solicitud, respuesta); devolver falso; } else return real; } / *** Después de que el procesador empresarial complete el procesamiento de la solicitud, la acción ejecutada antes de generar la vista* Puede agregar datos a la vista ModelAndView, como la hora actual* / @Override public Void Posthandle (HttpServletRequest Solicitud, Respuesta HttpServletResponse, Handler de objetos, ModelAndView ModelandView) arroja una excepción {excepción { log.info("=========================================================================================================== log.info("========================================================================================== =============================================================================================================================================================================================================. ================================================================================================================================================================================================. =============================================================================================================================================================================================================. Respuesta, Handler de objetos, Exception Ex) lanza la excepción {log.info ("============== 执行顺序: 3 、 AfterCompletion ================"); NOTA: En el código anterior, escribí un SoldUtil, que implementa principalmente funciones, como obtener la solicitud actual, el objeto de sesión, las páginas de guardado y encriptamiento, y la toma.
En este punto, se ha implementado el interceptor, y el efecto es el que se muestra en la figura:
Me bloquearé visitando /test /hola directamente
Después de iniciar sesión con éxito, saltará a la página correspondiente a /prueba /hola
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.