介绍一下拦截器大致流程:
前端请求-->放行前逻辑-->放行-->访问数据库资源-->放行后逻辑-->响应数据给前端
项目结构:
开始放代码:
1. 在pojo包下创建一个封装类Result.java(名字可以自由定义),用于响应给前端数据。
package com.itheima.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result {
private Integer code;//响应码,1 代表成功; 0 代表失败
private String msg; //响应信息 描述字符串
private Object data; //返回的数据
//测试方法
public static Result strMessage(String msg) {
return new Result(0, msg, null);
}
}
2. 现在Controller层加入一个Test.java文件
package com.itheima.controller;
import com.itheima.filter.AbcFilter;
import com.itheima.pojo.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController
public class Test {
Integer num = 111;//测试功能的数据。
@GetMapping ("/test")
public Result Test(){
log.info("查询到数据,num={}",num);
return Result.strMessage("查询到数据");//返回给前端信息
}
}
3. 在filter包下创建AbcFilter.java
-
package com.itheima.filter; import lombok.extern.slf4j.Slf4j; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import java.io.IOException; @Slf4j @WebFilter("/test")//拦截路径为/test public class AbcFilter implements Filter { public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { log.info("进入过滤器!!!"); filterChain.doFilter(servletRequest, servletResponse);//执行放行操作 log.info("通过执行"); } }
4. 使用Postman测试工具发送请求(注意是Get请求,因为后端是@GetMapping)
-
可以看见响应回来的结果是:
-
-
控制台输出结果:
5. 如果想要前端阻止访问后端数据,则修改doFilter()方法,加入判断语句,控制其流程,让其不执行filterChain.doFilter()。
-
package com.itheima.filter; import lombok.extern.slf4j.Slf4j; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import java.io.IOException; @Slf4j @WebFilter("/test")//拦截路径为/test public class AbcFilter implements Filter { public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { if (true) { log.info("进入过滤器!!!"); return;//结束方法 } filterChain.doFilter(servletRequest, servletResponse);//执行放行操作 log.info("通过执行"); } }
返回的结果:
-