拦截器与过滤器的使用场景以及springboot中使用拦截器

一、过滤器与拦截器的使用场景及访问流程

1、过滤器

  1. 对请求中的字符设置编码
  2. 登陆验证
  3. 对敏感字(非法文字)进行过滤
  4. 作为MVC框架中的前端控制器(拦截用户的请求

2、拦截器

  1. 日志记录
  2. 登录判断
  3. 权限检查

3、访问流程

二、Springboot继承拦截器的流程

  1. 定义一个类实现HandlerInterceptor接口
  2. 定义一个配置类实现WebMvcConfigurer接口,在配置类中添加拦截器
  3. 最后再通过@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路径,看一下账号密码是否为空,如果是空的就直接不放行

这样拦截器就注册好了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值