【实现方案】Springboot整合token的权限管理实现(二)—— 配置服务器拦截器与跨域访问权限

前置说明

前一篇文章介绍了如何使用 JWT 生成与解析 token。这篇文章给大家介绍,当我们使用 springboot 进行开发时,如何从后端解决跨域访问问题,以及如何配置 request 拦截器。

跨域访问

一、什么是跨域访问?

跨域的严格一点的定义是:只要协议,域名,端口有任何一个的不同,就被当作是跨域。

从现在的开发技术而言,大家越来越讲究前后端分离开发。如果前后端分离,那么势必会遇到跨域访问的问题。跨域访问可以从前端或后端做相应设置来进行解决。本文在后端进行配置,解决跨域访问的问题。

二、代码示例

多说一句,WebMvcConfigurer 这个接口非常的重要,可以在这里面配置各种自定义的拦截器。大家可以多做了解。

import xxx.interceptor.AuthenticationInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * @author amber
 */

@Configuration
public class CorsConfig implements WebMvcConfigurer {

    /**
     * 配置外部访问
     * @param registry
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        System.out.println("----------------------");
        registry.addMapping("/**")
                //允许任何地址访问到服务器
                .allowedOrigins("*")
                //允许携带cookie访问
                .allowCredentials(true)
                //允许一下请求方法
                .allowedMethods("GET", "POST", "DELETE", "PUT")
                .maxAge(3600);
    }
}

Request 拦截器

通过拦截器,我们可以轻松地将没有携带 token,或携带了非法 token 的请求拦截在执行 controller 之前。

代码示例
一、编写 AuthenticationInterceptor

编写自定义的拦截器本体,实现 HandlerInterceptor 的 prehandle 函数,来自定义拦截器。

import com.fasterxml.jackson.databind.ObjectMapper;
import xxx.productLibbackend.base.dto.MyResponse;
import xxx.productLibbackend.base.utils.TokenUtil;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;

/**
 * @author amber 
 */

public class AuthenticationInterceptor implements HandlerInterceptor {

    /**
     * 设置拦截器,对每次前端发送的请求做token校验
     *
     * @return
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object object) throws Exception {
        Cookie[] cookies = request.getCookies();
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                //验证是否是本系统的cookie
                if (cookie.getName().equals("token")) {
                    String oldToken = cookie.getValue();
                    String newToken = TokenUtil.refreshToken(oldToken);
                    //token过期或非法
                    if (newToken == null) {
                        addHeader(request, response);
                        return false;
                    }
                    cookie.setValue(newToken);
                    //与token过期时间一样,10min
                    cookie.setMaxAge(10 * 60);
                    cookie.setPath("/");
                    response.addCookie(cookie);
                    return true;
                }
            }
        }
        addHeader(request, response);
        return false;
    }

	public void addHeader(HttpServletRequest request, HttpServletResponse response){
        String origin = request.getHeader("Origin");
        response.addHeader("Access-Control-Allow-Origin", origin);
        response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD");
        response.addHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");
        response.addHeader("Access-Control-Allow-Credentials", "true");
        response.addHeader("Access-Control-Max-Age", "3600");
    }
}

这里为什么要在每次 return false 之前要加头部信息,我会在下一篇进行叙述。


二、Config 注册拦截器

在编写完拦截器后,我们要在 Config 中注册拦截器,让其发挥作用。
还是在刚才提到的 WebMvcConfigurer 中实现函数来进行注册。

import xxx.interceptor.AuthenticationInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * @author amber
 */

@Configuration
public class Config implements WebMvcConfigurer {
/**
     * 配置请求拦截器
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 将自定义的token拦截器在这里注册、参数设置
        registry.addInterceptor(authenticationInterceptor())
                .addPathPatterns("/test/**")
                //对以下路由不进行拦截
                .excludePathPatterns("/test/getToken")
                .excludePathPatterns("/test/deToken");
    }

    @Bean
    //实例化
    public AuthenticationInterceptor authenticationInterceptor() {
        return new AuthenticationInterceptor();
    }

}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值