首页 > 编程语言 >前端 React + vite + Typescript 后端 java + springmvc + jwt 跨域 解决方案

前端 React + vite + Typescript 后端 java + springmvc + jwt 跨域 解决方案

时间:2023-05-31 14:34:46浏览次数:47  
标签:Control Typescript java 跨域 algorithm public token response String

首先后端配置跨域:

web.xml文件:

 

    <!--  配置跨域  -->
    <filter>
        <filter-name>header</filter-name>
        <filter-class>org.zhiyi.config.Cross</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>header</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <!--  配置跨域  -->

 这里注意需要允许认证使用的请求头添加到Access-Control-Allow-Headers 中

public class Cross implements Filter {

    public void destroy() {

    }

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        String originHeader = request.getHeader("Origin");
        response.setHeader("Access-Control-Allow-Origin", originHeader);
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "0");
        response.setHeader("Access-Control-Allow-Headers", "Origin, No-Cache, authorization, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With,userId,token");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        response.setHeader("XDomainRequestAllowed", "1");
        response.setHeader("XDomainRequestAllowed", "1");
        chain.doFilter(request, response);
    }

    public void init(FilterConfig arg0) throws ServletException {

    }
}

添加jwt配置信息到配置文件中:

token.tokenSecret=5c6095d3-d4b6-4729-a1b7-b8159d8d46ae
token.expireTime=86400000
token.algorithm=HmacSHA256

springmvc读取配置文件:

 注入:

 验证jwt_token以及生成 jwt_token

@Component
public class JWT {

    @Value("${token.tokenSecret}")
    private String tokenSecret;
    @Value("${token.expireTime}")
    private Long expireTime;
    @Value("${token.algorithm}")
    private String algorithm;

    public String genToken(HashMap<String, String> obj) throws NoSuchAlgorithmException, InvalidKeyException {

        long nowMillis = System.currentTimeMillis();
        long expMillis = nowMillis + expireTime;

        String header = "{\"alg\":\"HS256\",\"typ\": \"JWT\"}";
        String headerEncoded
                = Base64.getUrlEncoder()
                .withoutPadding()
                .encodeToString(
                        header.getBytes()
                );

        //向payload中添加数据
        obj.put("exp", expMillis + "");
        String payloadEncoded
                = Base64.getUrlEncoder()
                .withoutPadding()
                .encodeToString(
                        obj.toString().getBytes()
                );

        SecretKeySpec key = new SecretKeySpec(tokenSecret.getBytes(), algorithm);
        Mac mac = Mac.getInstance(algorithm);
        mac.init(key);
        String hp = headerEncoded + "." + payloadEncoded;
        String signatureEncoded
                = Base64.getUrlEncoder()
                .withoutPadding()
                .encodeToString(mac.doFinal(
                                hp.getBytes()
                        )
                );


        return hp + "." + signatureEncoded;
    }

    public HashMap<String, String> analysisToken(String token) throws NoSuchAlgorithmException, InvalidKeyException {
        HashMap<String, String> result = new HashMap<>();

        String[] tokens = token.split(".");

        SecretKeySpec key = new SecretKeySpec(tokenSecret.getBytes(), algorithm);
        Mac mac = Mac.getInstance(algorithm);
        mac.init(key);
        String hp = tokens[0] + "." + tokens[1];
        String signatureEncoded
                = Base64.getUrlEncoder()
                .withoutPadding()
                .encodeToString(mac.doFinal(
                                hp.getBytes()
                        )
                );

        if(signatureEncoded != tokens[2]){
            result.put("msg","verification_failed");
           return result;
        }

        String headerDecoded
                = new String(
                Base64.getUrlDecoder().decode(tokens[0])
        );

        String payloadDecoded
                = new String(
                Base64.getUrlDecoder().decode(tokens[1])
        );

        result.put("header",headerDecoded);
        result.put("payload",payloadDecoded);

        return result;
    }
}

通过登录接口将用户token返回到前端:

 前端将登录成功后将token保存到localStorage中:

前端 添加拦截器 将token放到请求头中:

 

标签:Control,Typescript,java,跨域,algorithm,public,token,response,String
From: https://www.cnblogs.com/laremehpe/p/17446009.html

相关文章

  • Java中常见转换-数组与list互转、驼峰下划线互转、Map转Map、List转Map、进制转换的多
    场景Java中数组与List互转的几种方式数组转List1、最简单的方式,Arrays.asList(array);创建的是不可变列表,不能删除和新增元素String[]array=newString[]{"a","b"};List<String>stringList=Arrays.asList(array);System.out.println(strin......
  • java - stream流
    一、创建stream流1、通过集合创建,这里以List为例List<Integer>integerList=newArrayList<>();integerList.add(1);integerList.add(2);integerList.add(3);Stream<Integer>stream1=integerList.stream(); 2、Array......
  • Java大文件分片上传/多线程上传功能
    ​ 我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用。这次项目的需求:支持大文件的上传和续传,要求续传支持所有浏览器,包括ie6,ie7,ie8,ie9,Chrome,Firefox,360安全浏览器,并且刷新浏览器后仍然能够续传,重启浏览器(关闭......
  • Vue+.net core 7 api跨域
    nginx的不说,直接说在项目中配置的。重点:前端要配代理,后端要设置返回的头文件信息。双管齐下1、前端在项目中的vue.config.js配置中进行设置module.exports={publicPath:'/',outputDir:'dist',//发布输入文件assetsDir:'static',//需要/demo目录下放打包后......
  • java api 设置kettle 日志到数据库
    设置到数据库transMeta.addDatabase(getDatabaseMeta(config));TransLogTableorigTransLogTable=transMeta.getTransLogTable();origTransLogTable.setConnectionName(config.getName());origTransLogTable.setTableName("r_log_trans&......
  • Java的volatile
    介绍volatilevolatile关键字可以说是Java虚拟机提供的最轻量级的同步机制,但是它并不容易被正确、完整地理解,以至于许多程序员都习惯去避免使用它,遇到需要处理多线程数据竞争问题的时候一律使用synchronized来进行同步。了解volatile变量的语义对理解多线程操作的其他特性......
  • Java的volatile
    介绍volatilevolatile关键字可以说是Java虚拟机提供的最轻量级的同步机制,但是它并不容易被正确、完整地理解,以至于许多程序员都习惯去避免使用它,遇到需要处理多线程数据竞争问题的时候一律使用synchronized来进行同步。了解volatile变量的语义对理解多线程操作的其他特性......
  • 序列化Java对象重命名字段,@JSONField、@JsonProperty、@SerializedName
    @JSONField主要用于返回出参转换这个注解分别可以注解在实体类的属性、setter和getter方法上publicclassTest{/*注解在属性上的时候可以设置一些序列化、格式化的属性@JSONField(serialize=false)---->序列化的时候忽略这个属性@JSO......
  • java9&10&11
    java9语法改进:接口的私有方法Java8中规定接口中的方法除了抽象方法之外,还可以定义静态方法和默认方法。一定程度上,扩展了接口的功能,此时的接口更像是一个抽象类。在Java9中,接口更加的灵活和强大,连方法的权限修饰符都可以声明为private的了,此时方法将不会称为你对外暴露API的......
  • 用Java开发HTTP代理服务器
    HTTP代理服务器是一种网络应用,它充当位于客户端和目标服务器之间的中间节点,将客户端发出的HTTP请求转发给目标服务器,并将目标服务器返回的HTTP响应内容回传给客户端。通过使用代理服务器,客户端可以避免直接访问目标服务器,从而更加安全地访问互联网资源。以下是使用Java开发HTTP......