Spring MVC拦截器和跨域请求

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

一、拦截器简介

Spring MVC拦截器和跨域请求,# Spring MVC,ssm框架,java,maven,spring,mvc

SpringMVC的拦截器(Interceptor)也是AOP思想的一种实现方式。它与Servlet的过滤器(Filter)功能类似,主要用于拦截用户的请求并做相应的处理,通常应用在权限验证、记录请求信息的日志、判断用户是否登录等功能上。
拦截器和过滤器的区别

  1. 拦截器是SpringMVC组件,而过滤器是Servlet组件。
  2. 拦截器不依赖Web容器,过滤器依赖Web容器。
  3. 拦截器只能对控制器请求起作用,而过滤器则可以对所有的请求起作用。
  4. 拦截器可以直接获取IOC容器中的对象,而过滤器就不太方便获取。 

二、拦截器使用

接下来我们使用SpringMVC拦截器,首先使用maven创建SprinMVC的web项目

2.1 控制器方法

package com.example.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class MyController1 {
    @RequestMapping ("/m1")
    public String m1(){
        System.out.println("控制器方法");
        return "result";
    }
}

2.2 编写拦截器类

创建拦截器类,该类实现HandlerInterceptor接口,需要重写三个方法:

  1. preHandle:请求到达Controller前执行的方法,返回值为true通过拦截器,返回值为false被拦截器拦截。
  2. postHandle:跳转到JSP前执行的方法
  3. afterCompletion:跳转到JSP后执行的方法
package com.example.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Scanner;

public class MyInterceptor implements HandlerInterceptor {
    // 请求到达Controller前执行
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.print("请求到达Controller前\t");
        // 如果return false则无法到达Controller
        // 控制台输入决定是否进入Controller
        System.out.print("控制台输入决定是否进入Controller: ");
        Scanner scanner = new Scanner(System.in);
        boolean flag;
        flag = scanner.nextBoolean();
        return flag;
    }

    // 跳转JSP前执行,此时可以向Request域添加数据
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.print("跳转JSP前\t");
        /*System.out.print("控制台输入决定是否添加数据: ");
        Scanner scanner = new Scanner(System.in);
        boolean flag;
        flag = scanner.nextBoolean();
        if(flag)*/
            request.setAttribute("name","HQX");
    }

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

 OK,首先我们这里到达控制器前和是否进入控制器还有是否跳转JSP,跳转到JSP后都有对应的提示。 

2.3 JSP页面

result.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>

这里把我们控制台输入的name响应到前端页面,但是age注定是没有属性的,因为跳转到JSP后才添加注定是没有意义的。

2.4 配置拦截器

接下来我们需要在SpringMVC核心配置文件中配置拦截器

<!-- 配置拦截器-->
<mvc:interceptors> 
  <mvc:interceptor>    
    <!-- 配置拦截器的作用路径-->   
    <mvc:mapping path="/**"/>    
    <!-- 拦截器对象 -->   
    <bean class="com.itbaizhan.interceptor.MyInterceptor"/> 
  </mvc:interceptor>
</mvc:interceptors>

2.5 测试结果

OK,第一次输入true后后面的提示信息也是可以出来的。已经成功拦截了

Spring MVC拦截器和跨域请求,# Spring MVC,ssm框架,java,maven,spring,mvc

2.6 全局拦截器

全局拦截器可以拦截所有控制器处理的URL,作用等于/**,配置方式如下:

<!-- 配置拦截器 -->
<mvc:interceptors> 
  <!-- 全局拦截器 -->  
  <bean class="com.itbaizhan.interceptor.MyInterceptor">
  </bean>
</mvc:interceptors>

三、拦截器链与执行顺序

Spring MVC拦截器和跨域请求,# Spring MVC,ssm框架,java,maven,spring,mvc

如果一个URL能够被多个拦截器所拦截,全局拦截器最先执行,其他拦截器根据配置文件中配置的从上到下执行,但是我实操下来发现并不是这样。接下来我来验证一下我的想法,再配置一个拦截器2:

3.1 拦截器2

package com.example.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Scanner;

public class MyInterceptor2 implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.print("拦截器2:请求到达Controller前\t");
        // 如果return false则无法到达Controller
        // 控制台输入决定是否进入Controller
        System.out.print("控制台输入决定是否进入Controller: ");
        Scanner scanner = new Scanner(System.in);
        boolean flag;
        flag = scanner.nextBoolean();
        return flag;
    }

    // 跳转JSP前执行,此时可以向Request域添加数据
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.print("拦截器2:跳转JSP前\t");
        /*System.out.print("控制台输入决定是否添加数据: ");
        Scanner scanner = new Scanner(System.in);
        boolean flag;
        flag = scanner.nextBoolean();
        if(flag)*/
            request.setAttribute("age","10");
    }

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

这里再配置一个拦截器,为了更能体现拦截器的拦截顺序。 

3.2 配置拦截器链

    <!-- 配置拦截器-->
    <mvc:interceptors>
        <!-- 拦截器1 -->
        <mvc:interceptor>
            <!-- 配置拦截器的作用路径(没有该作用路径标签则是全局拦截器) -->
            <mvc:mapping path="/m1"/>
            <!-- 拦截器对象 -->
            <bean class="com.example.interceptor.MyInterceptor"/>
        </mvc:interceptor>
        <!-- 拦截器2 -->
        <mvc:interceptor>
            <!-- 配置拦截器的作用路径(没有该作用路径标签则是全局拦截器) -->
            <mvc:mapping path="/m1"/>
            <!-- 拦截器对象 -->
            <bean class="com.example.interceptor.MyInterceptor2"/>
        </mvc:interceptor>
        <!-- 全局拦截器 -->
        <bean class="com.example.interceptor.GlobalInterceptor"/>
    </mvc:interceptors>

我们这里测试的拦截器1,2拦截路径都是/m1,我们把全局拦截器放在最后看一下执行顺序是如何的,如果按照上面的说法的话,则应该先提示全局拦截器,再拦截器1,拦截器2的提示信息。接下来我们来看一下实际结果吧。 

3.3 测试结果

Spring MVC拦截器和跨域请求,# Spring MVC,ssm框架,java,maven,spring,mvc

 我们可以看到当访问/m1的时候,首先进入控制器前出现的顺序是拦截器1,然后拦截器2,最后是全局拦截器,然后跳转JSP前的顺序才是全局拦截器、拦截器2,拦截器1,跳转JSP后的也是如此。

四、拦截器过滤敏感词案例

接下来我们编写一个拦截器案例,需求如下:
在系统中,我们需要将所有响应中的一些敏感词替换为 *** ,此时可以使用拦截器达到要求: 

4.1  编写控制方法

    @RequestMapping("/m2")
    public String m2(Model model){
        model.addAttribute("name","大笨蛋");
        return "result";
    }

4.2 创建敏感词拦截器

package com.example.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
import java.util.Set;

public class SensitiveWordInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // 敏感词列表
        String[] sensitiveWords = {"坏人","暴力","笨蛋"};
        // model中所有数据

        if(modelAndView!=null) {
            Map<String, Object> model = modelAndView.getModel();
            Set<Map.Entry<String, Object>> entries = model.entrySet();

            // 遍历model
            for (Map.Entry<String, Object> entry : entries) {
                String key = entry.getKey();
                String value = entry.getValue().toString();
                // 将model值和敏感词列表遍历比对
                for (String sensitiveWord : sensitiveWords) {
                    // 如果model包含敏感词,则替换
                    if (value.contains(sensitiveWord)) {
                        String newStr = value.replaceAll(sensitiveWord, "***");
                        model.put(key, newStr);
                    }
                }
            }
        }
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    }
}

4.3 配置拦截器

    <!-- 敏感词拦截器 -->
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <bean class="com.example.interceptor.SensitiveWordInterceptor"/>
    </mvc:interceptor>

4.4 测试结果

Spring MVC拦截器和跨域请求,# Spring MVC,ssm框架,java,maven,spring,mvc

OK,我们可以发现笨蛋确实是被换成了***。 

五、跨域请求

5.1 同源策略

同源策略是浏览器的一个安全功能。同源,指的是两个URL的协议,域名,端口相同。浏览器出于安全方面的考虑,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源。
哪些不受同源策略限制:

  1. 页面中的 <a> 跳转、表单提交不会受到同源策略限制的。
  2. 静态资源引入也不会受到同源策略限制。如嵌入到页面中的 <script src=""> , <img src=""> ,<link href=""> 等。

最容易收到同源策略影响的就是Ajax请求。

5.2 跨域请求

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

当前页面URL  被请求页面URL 是否跨域 原因
https://www.csdn.net/ https://www.csdn.net/index.html
https://www.csdn.net/ http://www.csdn.net/index.html 跨域 协议不同
http://www.csdn.com/ http://www.baidu.com/ 跨域 主域名不同
http://csdn.csdn.net/ http://www.csdn.net/ 跨域 子域名不同
http://www.csdn.net:8080 http://www.csdn.net:8081 跨域 端口号不同

5.3 控制器接收跨域请求

SpringMVC提供了注解@CrossOrigin解决跨域问题。用法如下:

控制器方法

    @RequestMapping("/m3")
    @ResponseBody
    @CrossOrigin("http://localhost:8080")
    public String m3(){
        System.out.println("测试跨域请求");
        return "success";
    }

编写JSP页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>跨域请求</title>
    <script src="js/jquery-2.1.1.min.js"></script>
    <script>
        $(function (){
            $("#btn").click(function (){
                $.get("http://localhost:8080/m3",function (data){
                    console.log(data);
                })
                /*$.get("http://127.0.0.1:8080/m3",function (data){
                    console.log(data);
                })*/
            })
        })
    </script>
</head>
<body>
    <button id="btn" >异步请求</button>
</body>
</html>

测试结果 

当注释掉跨域注解时,运行是这样的。因为是没有跨域,但是当我们使用127.0.0.1时就会报错。

Spring MVC拦截器和跨域请求,# Spring MVC,ssm框架,java,maven,spring,mvc

使用127.0.0.1时,且没有添加注解时的运行结果是这样的:可以看到这时就不能成功success了

Spring MVC拦截器和跨域请求,# Spring MVC,ssm框架,java,maven,spring,mvc​ 

当添加到注解后,无论是8080还是127.0.0.1都能够成功success了

Spring MVC拦截器和跨域请求,# Spring MVC,ssm框架,java,maven,spring,mvc

往期专栏&文章相关导读 

     大家如果对于本期内容有什么不了解的话也可以去看看往期的内容,下面列出了博主往期精心制作的Maven,Mybatis等专栏系列文章,走过路过不要错过哎!如果对您有所帮助的话就点点赞,收藏一下啪。其中Spring专栏有些正在更,所以无法查看,但是当博主全部更完之后就可以看啦。

1. Maven系列专栏文章

Maven系列专栏 Maven工程开发
Maven聚合开发【实例详解---5555字】

2. Mybatis系列专栏文章

Mybatis系列专栏 MyBatis入门配置
Mybatis入门案例【超详细】
MyBatis配置文件 —— 相关标签详解
Mybatis模糊查询——三种定义参数方法和聚合查询、主键回填
Mybatis动态SQL查询 --(附实战案例--8888个字--88质量分)
Mybatis分页查询——四种传参方式
Mybatis一级缓存和二级缓存(带测试方法)
Mybatis分解式查询
Mybatis关联查询【附实战案例】
MyBatis注解开发---实现增删查改和动态SQL
MyBatis注解开发---实现自定义映射关系和关联查询

3. Spring系列专栏文章

Spring系列专栏 Spring IOC 入门简介【自定义容器实例】
IOC使用Spring实现附实例详解
Spring IOC之对象的创建方式、策略及销毁时机和生命周期且获取方式
Spring DI简介及依赖注入方式和依赖注入类型
Spring IOC相关注解运用——上篇
Spring IOC相关注解运用——下篇
Spring AOP简介及相关案例
注解、原生Spring、SchemaBased三种方式实现AOP【附详细案例】
Spring事务简介及相关案例
Spring 事务管理方案和事务管理器及事务控制的API
Spring 事务的相关配置、传播行为、隔离级别及注解配置声明式事务

4. Spring MVC系列专栏文章   

SpringMVC系列专栏 Spring MVC简介附入门案例
Spring MVC各种参数获取及获取方式自定义类型转换器和编码过滤器
Spring MVC获取参数和自定义参数类型转换器及编码过滤器
Spring MVC处理响应附案例详解
Spring MVC相关注解运用 —— 上篇

Spring MVC相关注解运用 —— 中篇

Spring MVC相关注解运用 —— 下篇
Spring MVC多种情况下的文件上传
Spring MVC异步上传、跨服务器上传和文件下载
Spring MVC异常处理【单个控制异常处理器、全局异常处理器、自定义异常处理器】
Spring MVC拦截器和跨域请求
SSM整合案例【C站讲解最详细流程的案例】

  文章来源地址https://www.toymoban.com/news/detail-592542.html

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

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

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

相关文章

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

    Spring MVC 是 Spring 框架的一部分,主要用于构建 Web 应用程序和 RESTful 服务。Spring MVC 拦截器是一种在请求到达控制器之前或响应返回视图之前对请求进行处理的机制。它可以对请求进行拦截和修改,比如在请求中添加一些头信息、记录请求日志、进行身份验证等。跨域请求则

    2024年02月03日
    浏览(23)
  • Spring MVC学习之——拦截器

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

    2024年01月20日
    浏览(35)
  • SpringMVC简介、请求与响应、REST风格、SSM整合、拦截器

    目录 SpringMVC简介 SpringMVC概述 入门案例 入门案例工作流程分析 Controller加载控制 PostMan 请求与响应 设置请求映射路径 五种类型参数传递 JSON数据传输参数  JSON对象数据 JSON对象数组 日期类型参数传递  响应  REST风格 REST风格简介 RESTful入门案例 RESTful快速开发 RESTful案例 SSM整

    2024年02月05日
    浏览(29)
  • Spring MVC拦截器Interceptor使用(判断用户登录)

    Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理。例如通过拦截器可以进行权限验证、记录请求信息的日志、判断用户是否登录等。 拦截器可以在进入处理器之前做一些操作,或者在处理器完成后进行操作,甚至是

    2024年02月09日
    浏览(33)
  • SpringMVC-2-Spring MVC拦截器详解:从入门到精通

    能够编写拦截器并配置拦截器 1.1 拦截器概念和作用 拦截器(Interceptor)是一种动态拦截方法调用的机制,在SpringMVC中动态拦截控制器方法的执行 作用: 在指定的方法调用前后执行预先设定的代码 阻止原始方法的执行 总结:增强 核心原理:AOP思想 1.2 拦截器和过滤器的区别

    2024年02月12日
    浏览(35)
  • Spring MVC学习笔记,包含mvc架构使用,过滤器、拦截器、执行流程等等

    😀😀😀创作不易,各位看官点赞收藏. Spring MVC:Spring MVC是Spring Framework的一部分,是基于java实现的MVC的轻量级Web框架。 官网文档地址:https://docs.spring.io/spring-framework/docs/4.2.4.RELEASE/spring-framework-reference/html/mvc.html 轻量级,简单易学。 高效,基于请求和响应的MVC框架。 与Spri

    2024年02月15日
    浏览(37)
  • 学习 [Spring MVC] 的JSR 303和拦截器,提高开发效率

                                                   🎬 艳艳耶✌️ :个人主页                                                  🔥 个人专栏 : 《推荐】Spring与Mybatis集成整合》                                                  ⛺️    生活的理想,不断更

    2024年02月09日
    浏览(35)
  • Spring-MVC使用JSR303及拦截器,增强网络隐私安全

    目录 一、JSR303 ( 1 )  是什么 ( 2 )  作用 ( 3 )  常用注解 ( 4 )  入门使用 二、拦截器 2.1  是什么 2.2  拦截器与过滤器的区别 2.3  应用场景 2.4 基础使用 2.5 用户登录权限控制 给我们带来的收获 JSR 303是Java规范请求(Java Specification Request)的一部分, 它定义了一套标准的Jav

    2024年02月09日
    浏览(34)
  • Spring中添加打印请求头的拦截器

    因为最近这个项目没有调用链监控系统的支持,但是,本地PostMan调试的时候又需要请求头才能正常调试。 喊ChatGPT实现一下能够打印所有请求头的拦截器,然后,集成到已有代码即可。 在Springboot的配置类中集成上面的拦截器即可。 这就是简单使用HandlerInterceptor,实现自己的

    2024年02月09日
    浏览(23)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包