一、过滤器与拦截器的使用场景及访问流程
1、过滤器
- 对请求中的字符设置编码
- 登陆验证
- 对敏感字(非法文字)进行过滤
- 作为MVC框架中的前端控制器(拦截用户的请求
2、拦截器
- 日志记录
- 登录判断
- 权限检查
3、访问流程
二、Springboot继承拦截器的流程
- 定义一个类实现HandlerInterceptor接口
- 定义一个配置类实现
WebMvcConfigurer
接口,在配置类中添加拦截器 - 最后再通过@Configuration注解注入配置
三、具体的代码实现
1、实现HandlerInterceptor接口
package com.yinpeng.interceptorconfig.interceptor;
import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.databind.util.JSONPObject;
import com.yinpeng.util.result.Result;
import lombok.Data;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Field;
import java.util.*;
public class LoginInterceptor implements HandlerInterceptor {
/**
* 在请求处理之前进行调用(Controller方法调用之前)
* 真正的拦截方法
* 用来查看是否可以转化成User对象并且包含账号密码
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Map<String, String[]> parameterMap = request.getParameterMap();//请求类似于这这样:login?username=user1&username=user2&username=user3
Field[] declaredFields = User.class.getDeclaredFields();
ArrayList<String> fields = new ArrayList<>();//存储的user里面所有属性名字
for (Field declaredField : declaredFields) {
String fieldStr = declaredField.toString();
fields.add(fieldStr.substring(fieldStr.lastIndexOf(".") + 1));
}
List<String> includeFields = new ArrayList<>();//所有的参数
Set<String> requestKeys = parameterMap.keySet();
Iterator<String> iterator = requestKeys.iterator();
while (iterator.hasNext()) {
String key = iterator.next();
if (fields.contains(key)) {
includeFields.add(key);
}
}
for (String includeField : includeFields) {
if (request.getParameter(includeField) == null ||
request.getParameter(includeField).equals("") ||
includeFields.size() < 2) {
String result = JSON.toJSONString(Result.error().setMessage("账号或密码为空"));
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write(result);
return false;
}
}
return true;
}
/**
* 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
/**
* 整个请求结束之后被调用,也就是在DispatchServlet渲染了对应的视图之后执行(主要用于进行资源清理工作)
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
@Data
static class User {
private String userAccount;
private String userPassword;
}
}
preHandle
在Controller之前执行,拦截器的功能主要就是在这个部分实现
2、定义一个配置类实现WebMvcConfigurer
接口,在配置类中添加拦截器
3、最后再通过@Configuration注解注入配置
package com.yinpeng.interceptorconfig;
import com.yinpeng.interceptorconfig.interceptor.LoginInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class LoginConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
//注册TestInterceptor拦截器
InterceptorRegistration registration = registry.addInterceptor(new LoginInterceptor());
registration.addPathPatterns("/login"); //登陆添加拦截器查看账号密码是否输入
registration.excludePathPatterns(
//"/**/*.html",
//"/**/*.js",
//"/**/*.css"
);
}
}
作用是就拦截login路径,看一下账号密码是否为空,如果是空的就直接不放行
这样拦截器就注册好了