【SpringMVC】| 拦截器 | 跨域请求 | 原理详解 | 代码实操

这篇具有很好参考价值的文章主要介绍了【SpringMVC】| 拦截器 | 跨域请求 | 原理详解 | 代码实操。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一. 🦁 前言

Spring MVC 是 Spring 框架的一部分,主要用于构建 Web 应用程序和 RESTful 服务。Spring MVC 拦截器是一种在请求到达控制器之前或响应返回视图之前对请求进行处理的机制。它可以对请求进行拦截和修改,比如在请求中添加一些头信息、记录请求日志、进行身份验证等。跨域请求则是指在浏览器中发起的与当前页面所在域名不同的请求,例如从前端的一个页面向后端的另一个域名发起 AJAX 请求。为了保证安全性与可控性,通常需要对跨域请求进行一些限制和处理。Spring MVC 提供了一些用于处理跨域请求的解决方案,例如使用 CORS 或 JSONP 等。

二. 🦁 拦截器 & 跨域请求

1. 拦截器

【SpringMVC】| 拦截器 | 跨域请求 | 原理详解 | 代码实操

SpringMVC的拦截器(Interceptor)也是AOP思想的一种实现方式。它与Servlet的过滤器(Filter)功能类似,主要用于拦截用户的

请求并做相应的处理,通常应用在权限验证记录请求信息的日志判断用户是否登录等功能上。

Ⅰ. 拦截器和过滤器(Filter)的区别

  • 拦截器是SpringMVC组件,而过滤器是Servlet组件。

  • 拦截器不依赖Web容器,过滤器依赖Web容器(Java EE 的组件)。

  • 拦截器只能对控制器请求起作用,而过滤器则可以对所有的请求起作用。

  • 拦截器可以直接获取IOC容器中的对象,而过滤器就不太方便获取

Ⅱ. 拦截器的使用步骤

tips:

咱们在学SpringMVC时,肯定是通过配置文件来配置拦截器的,现在狮子使用Springboot来搭建SpringMVC,就不需要写配置文件那么繁琐!!!可以使用WebMvcConfigurer接口来配置拦截器链,从而替代Spring MVC中的拦截器配置文件(mvc-dispatcher-servlet.xml,详细流程如下:

1. 创建SpringBoot项目,添加Spring Web依赖
2. 创建控制器方法
@RequestMapping("/m1")
public String m1(){
  System.out.println("控制器方法");
  return "result";
}
3. 创建拦截器类

该类实现HandlerInterceptor接口,需要重写三个方法:

preHandle:请求到达Controller前执行的方法,返回值为true通过拦截器,返回值为false被拦截器拦截。

postHandle:跳转到JSP前执行的方法。

afterCompletion:跳转到JSP后执行的方法。

// 拦截器类
public class MyInterceptor implements HandlerInterceptor {
  // 请求到达Controller前执行
  @Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
    System.out.println("请求到达Controller前");
    // 如果return false则无法到达Controller
    return true;
   }


  // 跳转到JSP前执行,此时可以向Request域添加数据
  @Override
  public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
    System.out.println("跳转到JSP前");
    request.setAttribute("name","百战");
   }


  // 跳转到JSP后执行,此时已经不能向Request域添加数据
  @Override
  public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
    System.out.println("跳转到JSP后");
    request.setAttribute("age",10);
   }
}

4. 编写JSP页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>结果</title>
  </head>
  <body>
    <h3>name:${requestScope.name}</h3>
    <h3>age:${requestScope.age}</h3>
  </body>
</html>
5. 配置Interceptor核心配置类
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 InterceptorConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new UserInterceptor())	// addInterceptor()方法添加一个拦截器
                .addPathPatterns("/campus/**")			// addPathPatterns()方法指定拦截的路径
                .addPathPatterns("/edu/**")
                .addPathPatterns("/info/**")
                .addPathPatterns("/pos/**")
                .addPathPatterns("/project/**")
                .addPathPatterns("/project/**");
        		.excludePathPatterns("/login"); // 排除/login请求,   excludePathPatterns()方法则指定不拦截的路径
    }
}
6. 拦截器链与执行顺序

【SpringMVC】| 拦截器 | 跨域请求 | 原理详解 | 代码实操

如果一个URL能够被多个拦截器所拦截,全局拦截器最先执行,其他拦截器根据配置文件中配置的从上到下执行。

tips:

  • preHandle()顺序执行,postHandle()、afterComletion()逆序执行。

  • 只要有一个preHandle()拦截,后面的preHandle(),postHandle()都不会执行。

  • 只要相应的preHandle()放行,afterComletion()就会执行。

Ⅲ. 实操——拦截器过滤敏感词案例

在Spring Boot中,配置拦截器链可以通过实现WebMvcConfigurer接口来完成。

  1. 创建一个WordFilter类,实现HandlerInterceptor接口,在preHandle方法中对请求参数中的敏感词进行过滤
@Component
public class WordFilter implements HandlerInterceptor {

    @Autowired
    private WordService wordService;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String wordString = request.getParameter("words"); // 假设敏感词参数名为"words"
        if (wordString != null) {
            String[] words = wordString.split(",");
            List<String> sensitiveWords = wordService.getAllWords(); // 获取所有敏感词
            for (String word : words) {
                if (sensitiveWords.contains(word)) { // 判断是否为敏感词
                    // 如果是敏感词,则输出提示信息并返回false,终止请求
                    response.setContentType("text/html;charset=UTF-8");
                    PrintWriter out = response.getWriter();
                    out.print("<script>alert('请求中包含敏感词 " + word + ",请修改后重试!');</script>");
                    out.flush();
                    out.close();
                    return false;
                }
            }
        }
        // 如果请求中没有敏感词,则返回true,继续请求
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // do nothing
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // do nothing
    }
}
  1. 创建一个WordService类,用于获取所有敏感词。这里假设将敏感词保存在一个List中。在实际应用中,可以将敏感词保存在数据库中,并提供相关的增删查改接口。
@Service
public class WordService {

    private static final List<String> WORD_LIST = Arrays.asList("敏感词1", "敏感词2", "敏感词3");

    public List<String> getAllWords() {
        return WORD_LIST;
    }
}
  1. WebConfig类中注册拦截器WordFilter
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private WordFilter wordFilter;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(wordFilter).addPathPatterns("/**");
    }
}

到此为止,敏感词过滤的示例已经完成

2. 跨域请求

同源策略是浏览器的一个安全功能。同源,指的是两个URL的协议,域名,端口相同。浏览器出于安全方面的考虑,不同源的客户

端脚本在没有明确授权的情况下,不能读写对方资源。(即前端策略,跟后端没啥关系)

【SpringMVC】| 拦截器 | 跨域请求 | 原理详解 | 代码实操

当请求URL的协议、域名、端口三者中任意一个与当前页面URL不同时即为跨域。浏览器执行JavaScript脚本时,会检查当前请求是否

同源,如果不是同源资源,就不会被执行。

哪些不受同源策略限制:

  • 页面中的 跳转、表单提交不会受到同源策略限制的。

  • 静态资源引入也不会受到同源策略限制。如嵌入到页面中的

Ⅰ.控制器接收跨域请求

【SpringMVC】| 拦截器 | 跨域请求 | 原理详解 | 代码实操

SpringMVC提供了注解**@CrossOrigin**解决跨域问题。

案例 一

在Spring Boot中,可以通过添加一个WebMvcConfigurer bean来配置跨域请求。以下是一个示例:

  1. 首先,在application.properties中添加以下配置:
# 允许跨域请求的域名(*表示允许任何域名)
spring.mvc.cross-origin.allowed-origins=*
# 允许跨域请求的HTTP方法
spring.mvc.cross-origin.allowed-methods=GET,POST,PUT,DELETE
# 允许跨域请求的HTTP头部信息
spring.mvc.cross-origin.allowed-headers=*
# 是否允许发送cookie
spring.mvc.cross-origin.allow-credentials=true
  1. 创建一个WebMvcConfigurer bean并重写addCorsMappings方法,设置跨域请求规则。例如:
@Configuration
public class CorsConfig implements WebMvcConfigurer {
 
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**") // 匹配所有路径
                .allowedOrigins("*") // 允许跨域请求的域名(*表示允许任何域名)
                .allowedMethods("GET", "POST", "PUT", "DELETE") // 允许跨域请求的HTTP方法
                .allowedHeaders("*") // 允许跨域请求的HTTP头信息
                .allowCredentials(true); // 是否允许发送cookie
    }
}

以上代码中,通过addMapping方法来设置需要允许跨域的路径,使用allowedOrigins方法允许跨域请求的域名,使用allowedMethods方法允许跨域请求的HTTP方法,使用allowedHeaders方法允许跨域请求的HTTP头信息,使用allowCredentials方法设置是否允许发送cookie。

需要注意的是,如果在WebMvcConfigurer bean中配置了跨域请求规则,就不需要再在Controller层添加跨域请求注解了。例如,以下代码中就不需要使用@CrossOrigin注解了:

@RestController
@RequestMapping("/api")
public class ApiController {

    @GetMapping("/hello")
    public String hello() {
        return "Hello, world!";
    }
}

到此为止,一个通过配置WebMvcConfigurer bean实现跨域请求的示例就完成了。

方案二

在Spring Boot中,可以使用@CrossOrigin注解来解决跨域请求,具体使用方法如下:

  1. 在Controller类或方法上添加@CrossOrigin注解。例如:
@RestController
@RequestMapping("/api")
@CrossOrigin(origins = "*", allowedHeaders = "*", methods = {RequestMethod.GET, RequestMethod.POST, RequestMethod.PUT, RequestMethod.DELETE}, allowCredentials = "true")
public class ApiController {

    @GetMapping("/hello")
    public String hello() {
        return "Hello, world!";
    }
}

以上代码中,@CrossOrigin注解的参数如下:

  • origins:允许跨域请求的域名,可以使用通配符*表示允许任何域名。
  • allowedHeaders:允许跨域请求的HTTP头信息。
  • methods:允许跨域请求的HTTP方法。
  • allowCredentials:是否允许发送cookie。
  1. 如果需要在多个Controller类或方法上使用相同的跨域请求规则,也可以在WebMvcConfigurer bean中配置全局的跨域请求规则。例如:
@Configuration
public class CorsConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**") // 匹配所有路径
                .allowedOrigins("*") // 允许跨域请求的域名(*表示允许任何域名)
                .allowedMethods("GET", "POST", "PUT", "DELETE") // 允许跨域请求的HTTP方法
                .allowedHeaders("*") // 允许跨域请求的HTTP头信息
                .allowCredentials(true); // 是否允许发送cookie
    }
}

以上代码中,通过addMapping方法来设置需要允许跨域的路径,使用allowedOrigins方法允许跨域请求的域名,使用allowedMethods方法允许跨域请求的HTTP方法,使用allowedHeaders方法允许跨域请求的HTTP头信息,使用allowCredentials方法设置是否允许发送cookie。

需要注意的是,如果在WebMvcConfigurer bean中配置了全局的跨域请求规则,就不需要在Controller层添加@CrossOrigin注解了。例如,以下代码中就不需要使用@CrossOrigin注解了:

@RestController
@RequestMapping("/api")
public class ApiController {

    @GetMapping("/hello")
    public String hello() {
        return "Hello, world!";
    }
}

到此为止,一个通过@CrossOrigin注解实现跨域请求的示例就完成了。

三. 🦁 最后

到这里,SpringMVC专栏更新完成啦,欢迎小伙伴们关注学习哦!!!一起加油😄文章来源地址https://www.toymoban.com/news/detail-437404.html

到了这里,关于【SpringMVC】| 拦截器 | 跨域请求 | 原理详解 | 代码实操的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot -05 SpringBoot web相关配置(静态资源访问、统一异常处理、文件上传、拦截器、统一跨域请求处理)

    小总结 SpringBoot是一个基于Spring的工具集,去帮我们完成了大量的配置。在SpringBoot中有一个约定大于配置的概念,就是他把我们很多第三方框架帮我们写好了,而且把我们整个第三方框架所需要的依赖全都通过起步依赖加进去了。开发中只需要加入起步依赖就可以实现某个场

    2024年02月01日
    浏览(43)
  • 【SpringMVC】| SpringMVC拦截器

    目录 一:SpringMVC拦截器 1. 拦截器介绍 2. HandlerInterceptor接口分析 3. 自定义拦截器实现权限验证 SpringMVC 中的 Interceptor 拦截器,它的主要作用是拦截指定的用户请求,并进行相应的预处理与后处理。其拦截的时间点在“处理器映射器根据用户提交的请求映射出了所要执行的处理

    2024年02月06日
    浏览(42)
  • springMVC之拦截器

    拦截器 SpringMVC中的拦截器用于拦截控制器方法的执行 SpringMVC中的拦截器需要实现HandlerInterceptor SpringMVC的拦截器必须在SpringMVC的配置文件中进行配置: FirstIntercepor类: SecondInterceptor类: SpringMVC中的拦截器有三个抽象方法: preHandle:控制器方法执行之前执行preHandle(),其bool

    2024年02月10日
    浏览(35)
  • SpringMVC:拦截器

    一般我们会做一些统一的操作这个时候我们需要使用springmvc提供的拦截器,例如token的验证,字段必填的操作,接口超时判断,签名验证,字段加密等操作,所以我们需要了解执行先后顺序。 我们来简单介绍下实现过程及对应代码,执行结果: 1、定义自己的spring mvc拦截器需

    2024年01月24日
    浏览(40)
  • SpringMVC 拦截器

    Spring MVC 拦截器是Spring框架中的一种机制,用于在请求到达处理器之前和渲染视图之前拦截请求,并允许开发者在这两个时间点进行自定义的处理逻辑。拦截器与过滤器(Filter)类似,但更加专注于对请求的处理器的拦截,比如对访问权限进行控制、日志记录、性能监控等。

    2024年01月19日
    浏览(42)
  • 一文学会 SpringMVC 拦截器

    ✅作者简介:2022年 博客新星 第八 。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏:SSM 框架从入门到精通 ✨特色专栏:国学周更-心性养成之路 🥭本文内容:一文学会 SpringM

    2024年02月02日
    浏览(47)
  • SpringMVC拦截器 (Interceptor)

            Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理。例如通过拦截器可以进行权限验证、判断用户是否登录等。         拦截器依赖于web框架,在实现上基于Java的反射机制,属于面向切面编程(AOP)的

    2024年01月22日
    浏览(46)
  • 12、SpringMVC之拦截器

    创建名为spring_mvc_interceptor的新module,过程参考9.1节和9.5节 与自定义的过滤器一样,自定义的拦截器也要配置后才能生效; 过滤器是服务器中的组件,所以配置到 web.xml 中; 拦截器是 springmvc 中的组件,因此要配置到 springmvc 的配置文件中。 因为在配置拦截器时,没有指定要

    2024年02月05日
    浏览(44)
  • SpringMVC Day 10 : 拦截器

    拦截器是Spring MVC框架提供的一种强大的机制,用于在请求到达控制器之前或之后进行预处理和后处理。它可以拦截并处理请求,对请求进行必要的修改或验证,以及在请求返回给客户端之前进行额外的操作。拦截器可以帮助我们实现各种需求,如身份验证、日志记录、性能监

    2024年02月06日
    浏览(39)
  • springmvc统一异常处理拦截器

    使用@RestControllerAdvice+@ExceptionHandler实现 也可以使用@ControllerAdvice+@ResponseBody+@ExceptionHandler实现 创建一个异常处理的类,放在config包下  组件类:  也可以让不同的异常返回不同的结果,捕获什么异常由@ExceptionHandler的value属性决定,传入一个类对象(可以通过反射获得)  

    2024年02月15日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包