阅读 2019

从零搭建自己的SpringBoot后台框架(十九)

Hello大家好,本章我们添加拦截器功能 。有问题可以联系我mr_beany@163.com。另求各路大神指点,感谢

在web开发的过程中,为了实现登录权限验证,安全验证等,我们往往需要添加一个拦截器在用户的的请求到达controller层的时候实现登录验证,那么SpringBoot如何添加拦截器呢?

一:添加拦截器

打开core→configurer→WebConfigurer

添加如下

/**
 * TODO  修改为自己的需求
 */
private static final String IZATION = "CHUCHEN";

/**
 * 添加拦截器  请求头拦截
 */
@Override
public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(
            //注意,HandlerInterceptorAdapter  这里可以修改为自己创建的拦截器
            new HandlerInterceptorAdapter() {
                @Override
                public boolean preHandle(HttpServletRequest request,
                                         HttpServletResponse response, Object handler) throws Exception {
                    String ization = request.getHeader("ization");
                    if(IZATION.equals(ization)){
                        return true;
                    }else{
                        RetResult<Object> result = new RetResult<>();
                        result.setCode(RetCode.UNAUTHORIZED).setMsg("签名认证失败");
                        responseResult(response, result);
                        return false;
                    }
                }
            }
            //这里添加的是拦截的路径  /**为全部拦截
        ).addPathPatterns("/userInfo/selectAlla");
}private void responseResult(HttpServletResponse response, RetResult<Object> result) {
    response.setCharacterEncoding("UTF-8");
    response.setHeader("Content-type", "application/json;charset=UTF-8");
    response.setStatus(200);
    try {
        response.getWriter().write(JSON.toJSONString(result, SerializerFeature.WriteMapNullValue));
    } catch (IOException ex) {
        LOGGER.error(ex.getMessage());
    }
}复制代码

二:测试

输入localhost:8080/userInfo/selectAll


输入localhost:8080/userInfo/selectAlla


在header中添加签名


三:自己创建拦截器

创建core→interceptor→Interceptor1

package com.example.demo.core.interceptor;

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

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Interceptor1 implements HandlerInterceptor {

    /**
     * 在请求处理之前进行调用(Controller方法调用之前)
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        System.out.println(">>>MyInterceptor1>>>>>>>  preHandle");
        // 只有返回true才会继续向下执行,返回false取消当前请求
        return true;
    }

    /**
     * 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                           ModelAndView modelAndView) throws Exception {
        System.out.println(">>>MyInterceptor1>>>>>>>  postHandle");
    }

    /**
     * 在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        System.out.println(">>>MyInterceptor1>>>>>>>  afterCompletion");
    }
}复制代码

四:修改WebConfigurer配置

修改addInterceptors  方法如下

@Override
public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(
            //注意,HandlerInterceptorAdapter  这里可以修改为自己创建的拦截器
            new Interceptor1() {
                @Override
                public boolean preHandle(HttpServletRequest request,
                                         HttpServletResponse response, Object handler) throws Exception {
                    String ization = request.getHeader("ization");
                    if(IZATION.equals(ization)){
                        return true;
                    }else{
                        RetResult<Object> result = new RetResult<>();
                        result.setCode(RetCode.UNAUTHORIZED).setMsg("签名认证失败");
                        responseResult(response, result);
                        return false;
                    }
                }
            }
            //这里添加的是拦截的路径  /**为全部拦截
        ).addPathPatterns("/userInfo/selectAlla");
}复制代码

五:测试

输入localhost:8080/userInfo/selectAlla


在header中添加签名


成功

项目地址

码云地址: gitee.com/beany/mySpr…

GitHub地址: github.com/MyBeany/myS…

写文章不易,如对您有帮助,请帮忙点下star

结尾

添加拦截器功能已完成,后续功能接下来陆续更新,有问题可以联系我mr_beany@163.com。另求各路大神指点,感谢大家。