一、拦截器简介
二、拦截器使用
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 编写拦截器类
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);
}
}
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>
2.4 配置拦截器
<!-- 配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<!-- 配置拦截器的作用路径-->
<mvc:mapping path="/**"/>
<!-- 拦截器对象 -->
<bean class="com.itbaizhan.interceptor.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
2.5 测试结果
2.6 全局拦截器
三、拦截器链与执行顺序
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>
3.3 测试结果
四、拦截器过滤敏感词案例
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 测试结果
五、跨域请求
5.1 同源策略
5.2 跨域请求
当前页面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 控制器接收跨域请求
控制器方法
@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>
测试结果
往期专栏&文章相关导读
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站讲解最详细流程的案例】 |