首页 > 编程知识 正文

springboot实现过滤器,拦截器和过滤器的区别 详解

时间:2023-05-03 19:46:52 阅读:17134 作者:1976

Spring过滤器和拦截器的区别

两者的作用

过滤器:

在javaweb上,您传递的request、response会预先过滤一些信息,预先设置一些参数,然后传递给servlet或struts操作进行业务逻辑。 例如,过滤不正确的URL (不是log in.do的地址请求,或者如果用户没有登录就进行过滤。

拦截器 :

面向切面编程是拦截器的一个简单实现,在服务或方法之前调用方法,在方法之后调用方法,在调用方法之前打印字符串(或操作了其他业务逻辑)

从具体实现区分

1 .过滤器是servlet的

2 .拦截器是spring aop的

细节区别

拦截器基于Java的反射机制,滤波器基于函数回调。

拦截器不依赖于servlet容器,过滤器依赖于servlet容器。

拦截器只对action请求起作用,但过滤器几乎对所有请求起作用。

阻止程序可以访问action上下文、值堆栈中的对象,但不能访问过滤器。

在action的生命周期中,将多次调用阻止程序,但在容器初始化时只调用一次过滤器。

拦截器可以获取IOC容器中的各个bean,但不能进行过滤,这一点很重要。 向拦截器注入服务后,可以调用业务逻辑。

工作流程及顺序

应用场景

对于不使用bean的请求预处理和响应后处理,可以进行编码、酷睿等过滤

如果使用bean,或者逻辑复杂且需要特殊处理,请使用拦截器

3 .但是,也可以不怕麻烦,自己建APP

代码实现

拦截器:

继承spring的HandlerInterceptorAdapter

Java代码publicclassessioninterceptorextendshandl

erInterceptorAdapter {        private static ThreadLocal<UserSessionVO> threadLocal = new ThreadLocal<UserSessionVO>();        private final Logger logger = LoggerFactory.getLogger(this.getClass());        @Autowired      private UserSessionService userSessionService;        @PostConstruct      public void init() {          logger.info("init");      }        @PreDestroy      public void destroy() {          logger.info("destroy");      }        @Override      public boolean preHandle(final HttpServletRequest request, final HttpServletResponse response, final Object handler) throws Exception {          logger.debug("SessionInterceptor.preHandle run....");            final URLAnalysis urlAnalysis = (URLAnalysis) request.getAttribute(Constants.URL_ANALYSIS);            final String userIdString = urlAnalysis.getParam(Constants.USERID);          final String accessToken = urlAnalysis.getParam(Constants.ACCESSTOKEN);          if (!StringUtils.isNotEmpty(userIdString)) {              throw new InvalidArgumentException("userId is required");          }          if (!StringUtils.isNotEmpty(accessToken)) {              throw new InvalidArgumentException("accessToken is required");          }          if (!NumberUtils.isNumber(userIdString)) {              throw new InvalidArgumentException("userId[" + userIdString + "] invalid");          }            final boolean result = userSessionService.checkLogin(Long.valueOf(userIdString), accessToken);          if (!result) {              throw new InvalidUserSessionException("Invalid accessToken[" + accessToken + "]");          }            final UserSessionVO userSessionVO = new UserSessionVO();          userSessionVO.setUserId(Long.valueOf(userIdString));          userSessionVO.setAccessToken(accessToken);          threadLocal.set(userSessionVO);          return result;      }        @Override      public void afterCompletion(final HttpServletRequest request, final HttpServletResponse response, final Object handler, final Exception ex) throws Exception {          logger.debug("SessionInterceptor.afterCompletion run....");            final UserSessionVO userSessionVO = threadLocal.get();            if (userSessionVO != null) {              // renewal session              userSessionService.renewalSessoin(userSessionVO.getUserId(), userSessionVO.getAccessToken());          }          threadLocal.remove();      }  }  

 

过滤器:

继承java的Filter,其实现是servlet

Java代码  public class CorsFilter implements Filter {    //    private final Log logger = LogFactory.getLog(this.getClass());        private final String allowedOrigins;      private final String allowCredentials;        public CorsFilter(final String allowedOrigins, final String allowCredentials) {          this.allowedOrigins = allowedOrigins;          this.allowCredentials = allowCredentials;      }        @Override      public void init(final FilterConfig filterConfig) throws ServletException {      }        @Override      public void doFilter(final ServletRequest req, final ServletResponse res, final FilterChain chain) throws IOException, ServletException {          final HttpServletRequest request = (HttpServletRequest) req;          final HttpServletResponse response = (HttpServletResponse) res;          final String method = request.getMethod();          // this origin value could just as easily have come from a database          response.setHeader("Access-Control-Allow-Origin", allowedOrigins);          response.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, DELETE, OPTIONS");          response.setHeader("Access-Control-Max-Age", "3600");          response.setHeader("Access-Control-Allow-Credentials", allowCredentials);          // "Content-Type, X-Requested-With, accept, Origin, Access-Control-Request-Method, Access-Control-Request-Headers"          response.setHeader("Access-Control-Allow-Headers", "Origin,Accept,X-Requested-With,Content-Type,Access-Control-Request-Method,Access-Control-Request-Headers,Authorization," + Constants.SESSIONID + "," + Constants.CSRFTOKEN);          if ("OPTIONS".equals(method)) {              response.setStatus(HttpStatus.OK.value());          } else {              chain.doFilter(req, res);          }      }        @Override      public void destroy() {      }  }  

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。