spring boot 拦截器 登录权限拦截

版权声明:原创欢迎转载,转载请注明出处 https://blog.csdn.net/ye17186/article/details/88820896

一、需求

系统中,除登录接口/login以外,其他所有接口,必须用户登录后才能访问。

二、实现

创建一个拦截器,拦截除/login以外的所有请求,校验用户是否已登录,如果已登录,则放行,否则拦截请求,给出未登录信息提示。

创建LoginInterceptor类,实现HandlerInterceptor接口,重写preHandle方法

package com.yclouds.service.demo.interceptor;

import com.yclouds.common.core.error.code.BaseError;
import com.yclouds.common.core.response.ApiResp;
import com.yclouds.common.core.utils.JsonUtils;
import com.yclouds.common.core.utils.StringUtils;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.cors.CorsUtils;
import org.springframework.web.servlet.HandlerInterceptor;

/**
 * 登录拦截器
 *
 * @author ye17186
 * @version 2019/3/26 14:49
 */
public class LoginInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
        Object handler) throws IOException {

        // PreFlight请求,忽略本拦截器
        if (CorsUtils.isPreFlightRequest(request)) {
            return true;
        }

        boolean flg = false; // 是否通过
        String token = request.getHeader("token");

        // 有token表示用户已登录(生产环境应该校验token合法性)
        if (StringUtils.isNotEmpty(token)) {
            flg = true;
        } else {
            // 根据系统需要,返回特定的消息格式
            ApiResp resp = ApiResp.retFail(BaseError.SYSTEM_NO_LOGIN);
            write(request, response, JsonUtils.toJson(resp));
        }
        return flg;
    }

    /**
     * 通过response返回错误信息给前端
     *
     * @param request 请求
     * @param response 响应
     * @param content 响应内容
     */
    private void write(HttpServletRequest request, HttpServletResponse response, String content)
        throws IOException {

        String origin = request.getHeader("Origin");
        response.setHeader("Access-Control-Allow-Origin", origin);
        response.setCharacterEncoding("UTF-8");
        response.setContentType("application/json; charset=utf-8");
        response.getWriter().write(content);
    }
}

注册该拦截器

package com.yclouds.service.demo.config;

import com.yclouds.service.demo.interceptor.LoginInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * 拦截器配置
 *
 * @author ye17186
 * @version 2019/3/26 15:00
 */
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {

        // 注册登录拦截器,拦截除/login以外的所有请求
        registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**")
            .excludePathPatterns("/login");
    }
}

三、测试

@GetMapping("/say3")
public ApiResp sayHello3() {
    log.info("业务处理...");
    return ApiResp.retOK();
}

1、发送不带token的请求,请求被拦截,并返回的错误信息提示

2、发送带token的请求,请求正确处理

GitHub地址:https://github.com/ye17186/spring-boot-learn

猜你喜欢

转载自blog.csdn.net/ye17186/article/details/88820896
今日推荐