当前位置:   article > 正文

SpringMVC_第五章(拦截器和过滤器)_springmvc过滤器

springmvc过滤器

1:什么是过滤器(Filter)

过滤器:

过滤器使用filter实现,拦截的是request请求,基于回调,基于servlect规范

依赖容器,有初始化方法和销毁方法,拦截的是地址,粒度很大

过滤器Filter:过滤器通过实现Filter接口,实现了过滤器的三个方法,分别是初始化方法,dofilter方法和销毁方法,随着容器的启动和销毁而初始化和销毁,依赖于servlet容器,过滤器拦截的是地址栏请求,过滤器实在进入容器后执行的servlet之前后执行,针对的在处理业务之前的操作。

过滤器(Filter),是 Servlet 规范规定的,在 Servlet 前执行的。用于拦截和处理 HTTP 请求和响应,可用于身份认证、授权、日志记录和设置字符集(CharacterEncodingFilter)等场景。

过滤器位于整个请求处理流程的最前端,因此在请求到达 Controller 层前,都会先被过滤器处理。

过滤器可以拦截多个请求或响应,一个请求或响应也可以被多个过滤器拦截。

chain.doFilter(request, response);这个方法的调用作为分水岭。事实上调用Servlet的doService()方法是在这个方法中进行的。

1.1:代码实现

过滤器代码:

  1. public class Filter1 implements Filter {
  2. public void destroy() {
  3. // TODO Auto-generated method stub
  4. System.out.println("过滤器1销毁方法");
  5. }
  6. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
  7. throws IOException, ServletException {
  8. // TODO Auto-generated method stub
  9. System.out.println("过滤器1,客户端向Servlet发送的请求被我拦截到了,设置请求编码");
  10. chain.doFilter(request, response);
  11. System.out.println("过滤器1,Servlet向客户端发送的响应被我拦截到了,设置相应编码");
  12. }
  13. public void init(FilterConfig filterConfig) throws ServletException {
  14. // TODO Auto-generated method stub
  15. System.out.println("过滤器1初始化方法");
  16. }
  17. }

xml配置:

  1. <filter>
  2. <filter-name>filterDemo1</filter-name>
  3. <filter-class>com.thit.filters.Filter1</filter-class>
  4. </filter>
  5. <filter-mapping>
  6. <filter-name>filterDemo1</filter-name>
  7. <url-pattern>/*</url-pattern>
  8. <!-- /*是对所有的文件进行拦截 -->
  9. </filter-mapping>

2:什么是拦截器

拦截器:

是基于Java的jdk动态代实现的,实现HandlerInterceptor接口。不依赖于servlet容器,

拦截器针对于contraller方法,并且能获取到所有的类,对类里面所有的方法实现拦截,粒度更小,拦截器中可以注入service,也可以调用业务逻辑

2.1:代码实现

拦截器1:

  1. //拦截器1
  2. public class LoginInterceptor implements HandlerInterceptor{
  3. //预处理1.程序先执行preHandle()方法,如果该方法的返回值为true,则程序会继续向下执行处理器中的方法,否则将不再向下执行。
  4. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
  5. throws Exception {
  6. // TODO Auto-generated method stub
  7. System.out.println("1:拦截器1,程序进入preHandle方法");
  8. User u=(User) request.getSession().getAttribute("user");
  9. if(u==null) {
  10. System.out.println("在进入方法之前判断session的用户是否为空!");
  11. System.out.println("地址:"+request.getContextPath());
  12. //http://localhost:8080/login
  13. response.sendRedirect(request.getContextPath()+"/login");
  14. return false;
  15. }
  16. return true;
  17. }
  18. //后处理 2.在业务处理器(即控制器Controller类)处理完请求后,会执行postHandle()方法,然后会通过DispatcherServlet向客户端返回响应。
  19. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
  20. ModelAndView modelAndView) throws Exception {
  21. // TODO Auto-generated method stub
  22. System.out.println("2:拦截器1,程序进入postHandle方法");
  23. }
  24. //完工之后 3.在DispatcherServlet处理完请求后,才会执行afterCompletion()方法。
  25. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
  26. throws Exception {
  27. // TODO Auto-generated method stub
  28. System.out.println("3:拦截器1,程序进入afterCompletion方法");
  29. }
  30. }

拦截器2:

  1. //拦截器2
  2. public class Interceptor2 implements HandlerInterceptor{
  3. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
  4. throws Exception {
  5. // TODO Auto-generated method stub
  6. System.out.println("1:拦截器2,进入到preHandle");
  7. return true;
  8. }
  9. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
  10. ModelAndView modelAndView) throws Exception {
  11. // TODO Auto-generated method stub
  12. System.out.println("2:拦截器2,进入到postHandle");
  13. }
  14. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
  15. throws Exception {
  16. // TODO Auto-generated method stub
  17. System.out.println("3:拦截器2,进入到afterCompletion");
  18. }
  19. }

springxml配置:

  1. <!--拦截器注册 -->
  2. <mvc:interceptors>
  3. <!--拦截器1 -->
  4. <mvc:interceptor>
  5. <!--拦截不同的controller方法 -->
  6. <!-- <mvc:mapping path="/users/search"/>
  7. <mvc:mapping path="/users/updatepwd"/>
  8. <mvc:mapping path="/users/search"/> -->
  9. <!--通配符 拦截子节点和孙节点 -->
  10. <mvc:mapping path="/users/**"/>
  11. <!--在使用通配符的过程中 排除指定拦截 -->
  12. <mvc:exclude-mapping path="/users/search"/>
  13. <bean class="com.thit.interceptor.LoginInterceptor"></bean>
  14. </mvc:interceptor>
  15. <!--拦截器2 -->
  16. <mvc:interceptor>
  17. <!--拦截不同的controller方法 -->
  18. <!-- <mvc:mapping path="/users/search"/>
  19. <mvc:mapping path="/users/updatepwd"/>
  20. <mvc:mapping path="/users/search"/> -->
  21. <!--通配符配置 -->
  22. <mvc:mapping path="/users/**"/>
  23. <bean class="com.thit.interceptor.Interceptor2"></bean>
  24. </mvc:interceptor>
  25. </mvc:interceptors>

xml配置:

  1. <!-- 方法一:这种方式默认读取WEB-INF下的(servlet-name)+(-servlet.xml) springmvc-servlet.xml并且名字是固定的 -->
  2. <!-- <servlet>
  3. <servlet-name>springmvc</servlet-name>
  4. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  5. </servlet>
  6. <servlet-mapping>
  7. <servlet-name>springmvc</servlet-name>
  8. <url-pattern>/</url-pattern>
  9. </servlet-mapping> -->
  10. <!-- 方法二:初始化参数命名空间 namespace 必须配置文件在放入在web-inf目录下 -->
  11. <!-- <servlet>
  12. <servlet-name>springmvc</servlet-name>
  13. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  14. <init-param>
  15. <param-name>namespace</param-name>
  16. <param-value>springmvc-servlet2</param-value>
  17. </init-param>
  18. </servlet>
  19. <servlet-mapping>
  20. <servlet-name>springmvc</servlet-name>
  21. <url-pattern>/</url-pattern>
  22. </servlet-mapping> -->
  23. <!-- 方法三:初始化contextConfigLocation,将配置文件放到任意目录下 -->
  24. <servlet>
  25. <servlet-name>springmvc</servlet-name>
  26. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  27. <init-param>
  28. <param-name>contextConfigLocation</param-name>
  29. <!-- <param-value>WEB-INF/classes/springmvc/springmvc.xml</param-value> -->
  30. <param-value>classpath*:springmvc/springmvc.xml</param-value>
  31. </init-param>
  32. </servlet>
  33. <servlet-mapping>
  34. <servlet-name>springmvc</servlet-name>
  35. <url-pattern>/</url-pattern>
  36. </servlet-mapping>

3:拦截器于过滤器对比

两者都是AOP编程思想的实现,都能够实现权限控制和日志记录等问题的处理,但是两者粒度不同拦截对象不一样

适用范围不同:Filter是servlet的规范,只能用于web程序,但是拦截器可以用于application等程序。

规范不同:Filter是servlet的规范。但是Interceptor是spring容器支撑,有spring框架支持。

使用资源不一样:spring的拦截器由于依赖spring,也是spring的一个组件,因此能够在拦截器中使用spring的任何资源和对象。例如service对象,数据源,事务管理等,通过ioc注入拦截器即可,而filter不能

粒度不同:Filter只能在servlet的前后起作用,而拦截器能在方法前后异常前后执行,更加灵活,粒度更小,spring框架程序优先使用拦截器。

4:案例执行图

执行结果如下:

/*
0:过滤器1的初始化方法
1:过滤器1,客户端向Servlet发送的请求被我拦截到了

2:拦截器1的前置方法 preHandle
3:拦截器2的前置方法 preHandle
4: controller主方法
5:拦截器2的后置方法postHandle(在controller主方法执行之后执行)
6:拦截器1的后置方法postHandle(在controller主方法执行之后执行)
7:拦截器2的完成后方法afterCompletion(在DispatcherServlet处理完请求后,才会执行)
8:拦截器1的完成后方法afterCompletion(在DispatcherServlet处理完请求后,才会执行)

9:过滤器1,Servlet向客户端发送的响应被我拦截到了
10:过滤器的销毁方法

*/

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/972782
推荐阅读
  

闽ICP备14008679号