当前位置:   article > 正文

SpringBoot配置过滤器和拦截器_springboot拦截器配置不拦截

springboot拦截器配置不拦截

 一、概念

 

1简介

过滤器是JavaEE中Servlet规范的一个组件,通过Filter技术,可以实现用户访问某个资源前,对访问的请求和响应进行拦截

拦截器Interceptor)类似于Servlet中的过滤器,主要用于拦截客户请求并做出相应的处理。


2 原理

过滤器在实现上基于函数回调,可以对几乎所有的请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要的数据。比如,在过滤器中修改字符编码,在过滤器中修改HttpServletRequest的一些参数。包括:过滤低俗文字,危险字符等。

 拦截器是基于java的反射机制的

 调用顺序:Filter>Interceptor>Aspect>Controller

当Controller抛出异常时,处理顺序是由内到外的。因此,经常定义一个@ControllerAdvice去统一处理控制器抛出的异常。一旦异常被@ControllerAdvice处理了,则调用拦截器的afterCompletion方法的参数Exception ex就为空了

3.区别

1.过滤器只能在容器初始化时被调用一次,在action的生命周期中,而拦截器可以多次被调用。
2.过滤器可以对几乎所有的请求起作用,拦截器只能对action请求起作用。
3.过滤器不能访问action上下文、值栈里的对象,而拦截器可以访问。
4.过滤器依赖于servlet容器,而拦截器不依赖于servlet容器。
5.过滤器是基于函数回调,而拦截器是基于java的反射机制的。
6.过滤器不能获取IOC容器中的各个bean,而拦截器可以,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。
 

二、配置 

1.过滤器配置

1.1 注解配置 

  1. package com.example.springbootmaven.filter;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.springframework.core.annotation.Order;
  4. import org.springframework.stereotype.Component;
  5. import javax.servlet.*;
  6. import javax.servlet.annotation.WebFilter;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. import java.io.IOException;
  10. @WebFilter(filterName="filter01",urlPatterns={"/*"})
  11. @Component
  12. @Order(1)
  13. public class ThreadNameFilter implements Filter {
  14. @Override
  15. public void destroy() {
  16. }
  17. @Override
  18. public void init(FilterConfig filterConfig) throws ServletException {
  19. }
  20. @Override
  21. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
  22. System.out.println("start");
  23. System.out.println(servletRequest.getClass());
  24. HttpServletResponse response = (HttpServletResponse) servletResponse;
  25. response.setStatus(200);
  26. response.setContentType("application/json");
  27. response.setCharacterEncoding("utf-8");
  28. response.getWriter().print("msg:"+request.getRequestURI());
  29. System.out.println("end");
  30. }
  31. }

注意:

@WebFilter表明此类为过滤器,filterName为过滤器名称,urlPatterns为过滤路径

@Order为过滤器过滤顺序,数字越小,越先被过滤

@Component声明为bean,被容器扫描加载

1.2 Java配置 

  1. package com.example.springbootmaven.filter;
  2. import javax.servlet.*;
  3. import javax.servlet.http.HttpServletRequest;
  4. import javax.servlet.http.HttpServletResponse;
  5. import java.io.IOException;
  6. public class ThreadNameFilter implements Filter {
  7. @Override
  8. public void destroy() {
  9. }
  10. @Override
  11. public void init(FilterConfig filterConfig) throws ServletException {
  12. }
  13. @Override
  14. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
  15. System.out.println("start");
  16. System.out.println(servletRequest.getClass());
  17. HttpServletResponse response = (HttpServletResponse) servletResponse;
  18. response.setStatus(200);
  19. response.setContentType("application/json");
  20. response.setCharacterEncoding("utf-8");
  21. response.getWriter().print("msg:"+request.getRequestURI());
  22. System.out.println("end");
  23. }
  24. }
  1. package com.example.springbootmaven.config;
  2. import com.example.springbootmaven.filter.ThreadNameFilter;
  3. import org.springframework.boot.web.servlet.FilterRegistrationBean;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.context.annotation.Configuration;
  6. /**
  7. */
  8. @Configuration
  9. public class BaseFilterConfig {
  10. /**
  11. * @返回值 org.springframework.boot.web.servlet.FilterRegistrationBean
  12. */
  13. @Bean
  14. public FilterRegistrationBean registFilter() {
  15. FilterRegistrationBean registration = new FilterRegistrationBean();
  16. registration.setFilter(new ThreadNameFilter());
  17. registration.addUrlPatterns("/getName");
  18. registration.setName("thread");
  19. registration.setOrder(Integer.MIN_VALUE);
  20. return registration;
  21. }
  22. }

注意:这种方式每声明一个过滤器,就要在配置类中创建一个 FilterRegistrationBean,以配置其名称、路径、顺序等

2.拦截器配置

  1. package com.kaishengit.config;
  2. import com.kaishengit.entity.Account;
  3. import org.springframework.web.servlet.ModelAndView;
  4. import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import javax.servlet.http.HttpSession;
  8. public class LoginInterceptor extends HandlerInterceptorAdapter {
  9. //请求拦截
  10. @Override
  11. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  12. HttpSession session = request.getSession();
  13. Account account = (Account)session.getAttribute("account");
  14. //未登录,跳转登录页
  15. if (account==null){
  16. String redirectPath = "/login";
  17. response.sendRedirect(redirectPath);
  18. return false;
  19. }
  20. return true;
  21. }
  22. //响应拦截
  23. @Override
  24. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
  25. super.postHandle(request, response, handler, modelAndView);
  26. }
  27. //视图渲染完成之后拦截
  28. @Override
  29. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
  30. super.afterCompletion(request, response, handler, ex);
  31. }
  32. }
  1. package com.kaishengit.config;
  2. import org.springframework.context.annotation.Configuration;
  3. import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
  4. import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
  5. @Configuration
  6. public class CustomerWebMvcConfigurer implements WebMvcConfigurer {
  7. /*
  8. * 设置拦截器需要拦截的路径
  9. * mvc路径拦截
  10. * 静态资源不拦截
  11. * */
  12. @Override
  13. public void addInterceptors(InterceptorRegistry registry) {
  14. registry.addInterceptor(new LoginInterceptor())
  15. .addPathPatterns("/**")
  16. .excludePathPatterns("/static/**");
  17. }
  18. }

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号