一、拦截器和过滤器
(1)过滤器:
依赖于servlet容器,是JavaEE标准,是在请求进入容器之后,还未进入Servlet之前进行预处理,并且在请求结束返回给前端这之间进行后期处理。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要获取的数据,比如:在过滤器中修改字符编码;在过滤器中修改HttpServletRequest的一些参数,包括:过滤低俗文字、危险字符等
(2)拦截器:
拦截器不依赖与servlet容器,依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架。在实现上基于Java的反射机制,属于面向切面编程(AOP)的一种运用。由于拦截器是基于web框架的调用,因此可以使用spring的依赖注入(DI)获取IOC容器中的各个bean,进行一些业务操作,同时一个拦截器实例在一个controller生命周期之内可以多次调用。但是缺点是只能对controller请求进行拦截,即⑴请求还没有到controller层时进行拦截,⑵请求走出controller层次,还没有到渲染时图层时进行拦截,⑶结束视图渲染,但是还没有到servlet的结束时进行拦截。对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理,拦截器功在对请求权限鉴定方面确实很有用处
二、代码
(1)程序框架,只需关注红线中四个文件
(2)过滤器配置
package com.server.config.filter; import javax.servlet.*; import java.io.IOException; /** * Created by c00415904 on 2018/6/28. */ public class MyFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("myFilter init....."); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("myFilter doFilter....."); filterChain.doFilter(servletRequest,servletResponse); } @Override public void destroy() { System.out.println("myFilter destroy....."); } } package com.server; import com.server.config.filter.MyFilter; import org.springframework.boot.SpringBootConfiguration; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import javax.servlet.Filter; /** * Created by c00415904 on 2018/6/28. */ @SpringBootConfiguration public class MyfilterConfig { @Bean public FilterRegistrationBean filterRegistrationBean(){ FilterRegistrationBean registrationBean = new FilterRegistrationBean(); registrationBean.setFilter(getMyFilter()); registrationBean.addUrlPatterns("/*"); registrationBean.addInitParameter("paramName","paramValue"); registrationBean.setName("myFilter"); return registrationBean; } @Bean(name="myfilter") public Filter getMyFilter(){ return new MyFilter(); } }此类的目录一般要与Application相同,当然也可以通过配置一些显示路径能够适配,为了简单就放在一起就OK。
(3)拦截器
package com.server.config.Intercept; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Created by c00415904 on 2018/6/27. */ @Component public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception { System.out.println("hello preHandler......"); return true; } @Override public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception { System.out.println("hello postHandler......"); } @Override public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception { System.out.println("hello afterCompletionHandler......"); } } package com.server; import com.server.config.Intercept.MyInterceptor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringBootConfiguration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; /** * Created by c00415904 on 2018/6/27. */ @SpringBootConfiguration public class MySpringMVCConfig extends WebMvcConfigurerAdapter { @Autowired private MyInterceptor myInterceptor; @Override public void addInterceptors(InterceptorRegistry registry){ registry.addInterceptor(myInterceptor).addPathPatterns("/**"); } }此类的目录简单与Application相同。
(4)程序结果
2018-06-28 19:55:29.484 [http-nio-8080-exec-1] DEBUG org.springframework.web.servlet.DispatcherServlet - Initializing servlet 'dispatcherServlet' 2018-06-28 19:55:29.485 [http-nio-8080-exec-1] INFO o.a.c.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring FrameworkServlet 'dispatcherServlet' 2018-06-28 19:55:29.485 [http-nio-8080-exec-1] INFO org.springframework.web.servlet.DispatcherServlet - FrameworkServlet 'dispatcherServlet': initialization started 2018-06-28 19:55:29.486 [http-nio-8080-exec-1] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'multipartResolver' 2018-06-28 19:55:29.486 [http-nio-8080-exec-1] DEBUG org.springframework.web.servlet.DispatcherServlet - Using MultipartResolver [org.springframework.web.multipart.support.StandardServletMultipartResolver@b829584] 2018-06-28 19:55:29.487 [http-nio-8080-exec-1] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Creating instance of bean 'org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver' 2018-06-28 19:55:29.495 [http-nio-8080-exec-1] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'org.springframework.cache.config.internalCacheAdvisor' 2018-06-28 19:55:29.496 [http-nio-8080-exec-1] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'org.springframework.transaction.config.internalTransactionAdvisor' 2018-06-28 19:55:29.499 [http-nio-8080-exec-1] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Finished creating instance of bean 'org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver' 2018-06-28 19:55:29.499 [http-nio-8080-exec-1] DEBUG org.springframework.web.servlet.DispatcherServlet - Unable to locate LocaleResolver with name 'localeResolver': using default [org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver@1c6767c6] 2018-06-28 19:55:29.499 [http-nio-8080-exec-1] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Creating instance of bean 'org.springframework.web.servlet.theme.FixedThemeResolver' 2018-06-28 19:55:29.509 [http-nio-8080-exec-1] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'org.springframework.cache.config.internalCacheAdvisor' 2018-06-28 19:55:29.509 [http-nio-8080-exec-1] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'org.springframework.transaction.config.internalTransactionAdvisor' 2018-06-28 19:55:29.511 [http-nio-8080-exec-1] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Finished creating instance of bean 'org.springframework.web.servlet.theme.FixedThemeResolver' 2018-06-28 19:55:29.511 [http-nio-8080-exec-1] DEBUG org.springframework.web.servlet.DispatcherServlet - Unable to locate ThemeResolver with name 'themeResolver': using default [org.springframework.web.servlet.theme.FixedThemeResolver@582bfa21] 2018-06-28 19:55:29.512 [http-nio-8080-exec-1] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'requestMappingHandlerMapping' 2018-06-28 19:55:29.512 [http-nio-8080-exec-1] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'viewControllerHandlerMapping' 2018-06-28 19:55:29.512 [http-nio-8080-exec-1] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'beanNameHandlerMapping' 2018-06-28 19:55:29.512 [http-nio-8080-exec-1] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'resourceHandlerMapping' 2018-06-28 19:55:29.512 [http-nio-8080-exec-1] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'defaultServletHandlerMapping' 2018-06-28 19:55:29.512 [http-nio-8080-exec-1] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'faviconHandlerMapping' 2018-06-28 19:55:29.512 [http-nio-8080-exec-1] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'requestMappingHandlerAdapter' 2018-06-28 19:55:29.512 [http-nio-8080-exec-1] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'httpRequestHandlerAdapter' 2018-06-28 19:55:29.512 [http-nio-8080-exec-1] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'simpleControllerHandlerAdapter' 2018-06-28 19:55:29.513 [http-nio-8080-exec-1] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'errorAttributes' 2018-06-28 19:55:29.513 [http-nio-8080-exec-1] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'handlerExceptionResolver' 2018-06-28 19:55:29.513 [http-nio-8080-exec-1] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Creating instance of bean 'org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator' 2018-06-28 19:55:29.520 [http-nio-8080-exec-1] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'org.springframework.cache.config.internalCacheAdvisor' 2018-06-28 19:55:29.521 [http-nio-8080-exec-1] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'org.springframework.transaction.config.internalTransactionAdvisor' 2018-06-28 19:55:29.521 [http-nio-8080-exec-1] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Finished creating instance of bean 'org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator' 2018-06-28 19:55:29.521 [http-nio-8080-exec-1] DEBUG org.springframework.web.servlet.DispatcherServlet - Unable to locate RequestToViewNameTranslator with name 'viewNameTranslator': using default [org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator@782c5e3a] 2018-06-28 19:55:29.522 [http-nio-8080-exec-1] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'beanNameViewResolver' 2018-06-28 19:55:29.522 [http-nio-8080-exec-1] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'mvcViewResolver' 2018-06-28 19:55:29.522 [http-nio-8080-exec-1] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'defaultViewResolver' 2018-06-28 19:55:29.522 [http-nio-8080-exec-1] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'viewResolver' 2018-06-28 19:55:29.524 [http-nio-8080-exec-1] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Creating instance of bean 'org.springframework.web.servlet.support.SessionFlashMapManager' 2018-06-28 19:55:29.552 [http-nio-8080-exec-1] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'org.springframework.cache.config.internalCacheAdvisor' 2018-06-28 19:55:29.553 [http-nio-8080-exec-1] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'org.springframework.transaction.config.internalTransactionAdvisor' 2018-06-28 19:55:29.554 [http-nio-8080-exec-1] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Finished creating instance of bean 'org.springframework.web.servlet.support.SessionFlashMapManager' 2018-06-28 19:55:29.554 [http-nio-8080-exec-1] DEBUG org.springframework.web.servlet.DispatcherServlet - Unable to locate FlashMapManager with name 'flashMapManager': using default [org.springframework.web.servlet.support.SessionFlashMapManager@435b33b4] 2018-06-28 19:55:29.554 [http-nio-8080-exec-1] DEBUG org.springframework.web.servlet.DispatcherServlet - Published WebApplicationContext of servlet 'dispatcherServlet' as ServletContext attribute with name [org.springframework.web.servlet.FrameworkServlet.CONTEXT.dispatcherServlet] 2018-06-28 19:55:29.554 [http-nio-8080-exec-1] INFO org.springframework.web.servlet.DispatcherServlet - FrameworkServlet 'dispatcherServlet': initialization completed in 68 ms 2018-06-28 19:55:29.554 [http-nio-8080-exec-1] DEBUG org.springframework.web.servlet.DispatcherServlet - Servlet 'dispatcherServlet' configured successfully 2018-06-28 19:55:29.572 [http-nio-8080-exec-1] DEBUG o.s.boot.web.filter.OrderedRequestContextFilter - Bound request context to thread: org.apache.catalina.connector.RequestFacade@84a924d myFilter doFilter..... 2018-06-28 19:55:29.575 [http-nio-8080-exec-1] DEBUG org.springframework.web.servlet.DispatcherServlet - DispatcherServlet with name 'dispatcherServlet' processing GET request for [/num] 2018-06-28 19:55:29.578 [http-nio-8080-exec-1] DEBUG o.s.w.s.m.m.a.RequestMappingHandlerMapping - Looking up handler method for path /num 2018-06-28 19:55:29.580 [http-nio-8080-exec-1] DEBUG o.s.w.s.m.m.a.RequestMappingHandlerMapping - Returning handler method [int com.server.controller.TestController.num()] 2018-06-28 19:55:29.580 [http-nio-8080-exec-1] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'testController' 2018-06-28 19:55:29.580 [http-nio-8080-exec-1] DEBUG org.springframework.web.servlet.DispatcherServlet - Last-Modified value for [/num] is: -1 hello preHandler...... 2018-06-28 19:55:29.594 [http-nio-8080-exec-1] INFO com.server.controller.TestController - get num 2018-06-28 19:55:29.604 [http-nio-8080-exec-1] DEBUG org.mybatis.spring.SqlSessionUtils - Creating a new SqlSession 2018-06-28 19:55:29.609 [http-nio-8080-exec-1] DEBUG org.mybatis.spring.SqlSessionUtils - SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@632df33c] was not registered for synchronization because synchronization is not active 2018-06-28 19:55:29.619 [http-nio-8080-exec-1] DEBUG o.springframework.jdbc.datasource.DataSourceUtils - Fetching JDBC Connection from DataSource 2018-06-28 19:55:29.945 [http-nio-8080-exec-1] DEBUG o.m.spring.transaction.SpringManagedTransaction - JDBC Connection [ProxyConnection[PooledConnection[com.mysql.jdbc.JDBC4Connection@602aedad]]] will not be managed by Spring 2018-06-28 19:55:29.948 [http-nio-8080-exec-1] DEBUG com.server.dao.UserDao.findCount - ==> Preparing: select count(*) from user_table 2018-06-28 19:55:29.970 [http-nio-8080-exec-1] DEBUG com.server.dao.UserDao.findCount - ==> Parameters: 2018-06-28 19:55:29.988 [http-nio-8080-exec-1] DEBUG com.server.dao.UserDao.findCount - <== Total: 1 2018-06-28 19:55:29.989 [http-nio-8080-exec-1] DEBUG org.mybatis.spring.SqlSessionUtils - Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@632df33c] 2018-06-28 19:55:29.989 [http-nio-8080-exec-1] DEBUG o.springframework.jdbc.datasource.DataSourceUtils - Returning JDBC Connection to DataSource 2018-06-28 19:55:30.058 [http-nio-8080-exec-1] DEBUG o.s.w.s.m.m.a.RequestResponseBodyMethodProcessor - Written [6] as "application/json" using [org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@483b0690] hello postHandler...... 2018-06-28 19:55:30.059 [http-nio-8080-exec-1] DEBUG org.springframework.web.servlet.DispatcherServlet - Null ModelAndView returned to DispatcherServlet with name 'dispatcherServlet': assuming HandlerAdapter completed request handling hello afterCompletionHandler...... 2018-06-28 19:55:30.059 [http-nio-8080-exec-1] DEBUG org.springframework.web.servlet.DispatcherServlet - Successfully completed request 2018-06-28 19:55:30.060 [http-nio-8080-exec-1] DEBUG o.s.boot.web.filter.OrderedRequestContextFilter - Cleared thread-bound request context: org.apache.catalina.connector.RequestFacade@84a924d