目录

引言

Spring 拦截器实现

实例理解

Spring 过滤器实现

实例理解

拦截器和过滤器的区别 

出身不同

触发时机不同

底层实现不同

支持的项目类型不同

使用场景不同


引言

Spring 拦截器实现

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;

@Component
public class TestInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("拦截器:执行 preHandle 方法。");
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("拦截器:执行 postHandle 方法。");
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("拦截器:执行 afterCompletion 方法。");
    }
}

实例理解

步骤
package com.example.demo.component;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/*
* 自定义拦截器
* */
@Component
public class LoginInterceptor implements HandlerInterceptor {
    /*
    * 调用目标方法之前执行的方法
    * 此方法返回 boolean 类型的值 如果返回的为 true 表示拦截器 验证成功 继续走后续的流程
    * 如果返回 false表示拦截器 验证未通过 后续的流程目标方法不要执行了
    * */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//        用户登录判断业务
        HttpSession session  = request.getSession(false);
        if(session != null && session.getAttribute("session_userinfo") != null) {
//            用户已经登录
            return true;
        }
//        到达此处说明用户未登录
//        我们可以直接重定向到登录页面
//        response.sendRedirect("/login.html");
//        此处我们未写登录页面,所以我们直接返回一个 401 表示客户端错误
        response.setStatus(401);
        return false;
    }
}

步骤
package com.example.demo.config;

import com.example.demo.component.LoginInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class MyConfig implements WebMvcConfigurer {

    @Autowired
    private LoginInterceptor loginInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginInterceptor)
                .addPathPatterns("/**")//拦截所有的 url  /* 代表一级 /** 代表多级
                .excludePathPatterns("/user/login") //排除 url /user/login 不拦截
                .excludePathPatterns("/user/register") 
                .excludePathPatterns("/css/**") //排除 css 文件夹下的所有文件
                .excludePathPatterns("/js/**") //排除 js 文件夹下的所有文件
                .excludePathPatterns("/image/**") //排除 image 文件夹下的所有文件
        ;
    }
}

Spring 过滤器实现

package com.example.demo.component;

import org.springframework.stereotype.Component;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

@Component
@WebFilter(urlPatterns = "/*")
public class TestFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("过滤器:执行 init 方法");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("过滤器:开始执行 doFilter 方法");
//        请求放行
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("过滤器:结束执行 doFilter 方法");
    }

    @Override
    public void destroy() {
        System.out.println("过滤器:执行 destroy 方法");
    }
}

注意:


实例理解

  • 此处我们想实现 敏感词过滤
package com.example.demo.component;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

@WebFilter(urlPatterns = "/*")
public class SensitiveWordsFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("过滤器:执行 init 方法");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("过滤器:开始执行 doFilter 方法");
        // 获取用户提交信息
        String message = servletRequest.getParameter("message");
        // 敏感词库
        String[] sensitiveWords = {"敏感词1", "敏感词2"};
        for (String sensitiveWord : sensitiveWords) {
            if (message.contains(sensitiveWord)) {
                message = message.replace(sensitiveWord, "*");
            }
        }
        servletRequest.setAttribute("message", message);
        // 请求放行
        filterChain.doFilter(servletRequest, servletResponse);
        System.out.println("过滤器:结束执行 doFilter 方法");
    }

    @Override
    public void destroy() {
        System.out.println("过滤器:执行 destroy 方法");
    }
}

拦截器和过滤器的区别 

  • 主要有 5 个方面

出身不同

  • 拦截器 来自于 Spring 框架
  • 过滤器 来自于 Servlet 

触发时机不同


底层实现不同

拦截器

过滤器


支持项目类型不同

使用场景不同

原文地址:https://blog.csdn.net/weixin_63888301/article/details/134777834

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_43270.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注