SpringBoot+vue2前后端项目配置ssl证书

这篇具有很好参考价值的文章主要介绍了SpringBoot+vue2前后端项目配置ssl证书。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.首先进入阿里云服务器,搜索ssl证书,免费申请,dns会自动解析该证书,所以不用设置

springboot配置ssl证书,springboot2,ssl,服务器,网络协议

 2.下载tomcat和nginx服务器类型的证书

springboot配置ssl证书,springboot2,ssl,服务器,网络协议

3.将tomcat服务器类型的文件解压,打开,获得pfx文件,放入项目的resources文件中

springboot配置ssl证书,springboot2,ssl,服务器,网络协议

springboot配置ssl证书,springboot2,ssl,服务器,网络协议

4.打开yml配置文件,进行SSL配置,并将http重定向到https

custom:
  http:
    port: 8002 # 自定义http启动端口

server: # https端口
  port: 8443
  ssl:
    key-store: classpath:8002091_suqiqaq.cn.pfx # pfk存放路径
    key-store-type: PKCS12  # tomcat服务器类型默认
    key-store-password: 1TFM7IpB # txt密码粘贴即可

  这里注意,server.port必须是https的端口,不然会出现https和http占用同一个端口

 5.添加配置类,让http重定向到https

package com.guigusuqi.commonutils.config;

import org.apache.catalina.Context;
import org.apache.catalina.connector.Connector;
import org.apache.tomcat.util.descriptor.web.SecurityCollection;
import org.apache.tomcat.util.descriptor.web.SecurityConstraint;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * https配置,将http请求全部转发到https
 */
@Configuration
public class HttpsConfig
{

    @Value("${custom.http.port}")
    private Integer httpPort;

    @Value("${server.port}")
    private Integer httpsPort;

    @Bean
    public TomcatServletWebServerFactory servletContainer() {
        // 将http请求转换为https请求
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
            @Override
            protected void postProcessContext(Context context) {
                SecurityConstraint constraint = new SecurityConstraint();
                // 默认为NONE
                constraint.setUserConstraint("CONFIDENTIAL");
                SecurityCollection collection = new SecurityCollection();
                // 所有的东西都https
                collection.addPattern("/*");
                constraint.addCollection(collection);
                context.addConstraint(constraint);
            }
        };
        tomcat.addAdditionalTomcatConnectors(httpConnector());
        return tomcat;
    }

    /**
     * 强制将所有的http请求转发到https
     * @return httpConnector
     */
    @Bean
    public Connector httpConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        // connector监听的http端口号
        connector.setPort(httpPort);
        connector.setSecure(false);
        // 监听到http的端口号后转向到的https的端口号
        connector.setRedirectPort(httpsPort);
        return connector;
    }
}

如果我们不想强制所有的请求都重定向到https或者某些功能接口需要http的支持等等,我们也可以同时开启http协议和https协议。

package cn.zlc.servicehttps.config;

import org.apache.catalina.Context;
import org.apache.catalina.connector.Connector;
import org.apache.tomcat.util.descriptor.web.SecurityCollection;
import org.apache.tomcat.util.descriptor.web.SecurityConstraint;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class HttpsConfig {

    @Value("${server.port}")
    private Integer httpPort;
    
    @Bean
    public TomcatServletWebServerFactory servletContainer() {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
        tomcat.addAdditionalTomcatConnectors(httpConnector());
        return tomcat;
    }

    @Bean
    public Connector httpConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setPort(httpPort);
        return connector;
    }

}

如果我们通过http端口请求的话,不会自动重定向到https端口,而且也不会提示需要TLS端口请求。而使用https请求的时候就会提示不安全,如果是放到服务器上访问https就正常了;

6.将SpringBoot项目打为Jar包放置到Linux服务器下

springboot配置ssl证书,springboot2,ssl,服务器,网络协议

如果是宝塔 记得把--server.port=8002删掉,这里yaml配置的是8443端口,不然会覆盖掉yaml的配置,导致https和http又公用了一个端口

访问后端接口文档成功 

springboot配置ssl证书,springboot2,ssl,服务器,网络协议

7. 开始配置前端的https,首先安全组放行443端口,这个端口类似于http的80端口

springboot配置ssl证书,springboot2,ssl,服务器,网络协议

springboot配置ssl证书,springboot2,ssl,服务器,网络协议

8.配置 nginx ,使用域名进行访问 

将前端的http协议,重定向到https协议,https协议默认是443端口,所以还需要在443端口进行配置,这里需要配置ssl证书路径

server
{
    listen 80;
    server_name suqiqaq.cn;
    index index.php index.html index.htm default.php default.htm default.html;
    # ssl证书路径
    ssl_certificate     /home/cert/8002091_suqiqaq.cn.pem;
    ssl_certificate_key /home/cert/8002091_suqiqaq.cn.key;
    root /home/hospital/app-api/dist;
   
    # $request_uri #包含请求参数的原始URI,不包含主机名
    # 如:”/foo/bar/arg”
    # $server_name #服务器名称
    # 将请求转成https,https协议默认是443端口,所以还需要在443端口进行配置
    return 301 https://$server_name$request_uri;
}

在nginx主配置文件中监听443端口,并将请求反向代理到https协议的8443端口

注意,这里需要把前端项目路径加上,不然宝塔一直提示没有该站点

server 
{
  listen 443 ssl;
  root /home/hospital/app-api/dist;
  index index.php index.html index.htm default.php default.htm default.html;
  server_name suqiqaq.cn;
  ssl_certificate     /home/cert/8002091_suqiqaq.cn.pem;
  ssl_certificate_key /home/cert/8002091_suqiqaq.cn.key;
 location ^~ /hospitalApi/
  {
      proxy_pass   https://127.0.0.1:8443/;
      # 这里是重点,如果上面的proxy_pass写成https的话这段是必须要配置的,不然只能访问页面,而页面调用端口不行
    proxy_ssl_certificate     /home/cert/8002091_suqiqaq.cn.pem;
    proxy_ssl_certificate_key /home/cert/8002091_suqiqaq.cn.key;
    proxy_ssl_protocols       TLSv1 TLSV1.1 TLSv1.2;
    proxy_ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    proxy_ssl_session_reuse  on;
    proxy_redirect off;
    proxy_set_header Host $proxy_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Nginx-Proxt true;
    proxy_set_header HTTP_X_FORWORDED_FOR $remote_addr;
   }
}

9.将前端的baseURL改为/hospitalApi,并把前端vue.config.js改为https协议,打包上线

vue.config.js:

'use strict'
const path = require('path')
const defaultSettings = require('./src/settings.js')

function resolve(dir) {
  return path.join(__dirname, dir)
}

const name = defaultSettings.title; // page title

// If your port is set to 80,
// use administrator privileges to execute the command line.
// For example, Mac: sudo npm run
// You can change the port by the following methods:
// port = 9528 npm run dev OR npm run dev --port = 9528
const port = 8080 // dev port

// All configuration item explanations can be find in https://cli.vuejs.org/config/
module.exports = {
  /**
   * You will need to set publicPath if you plan to deploy your site under a sub path,
   * for example GitHub Pages. If you plan to deploy your site to https://foo.github.io/bar/,
   * then publicPath should be set to "/bar/".
   * In most cases please use '/' !!!
   * Detail: https://cli.vuejs.org/config/#publicpath
   */
  publicPath: '/',
  outputDir: 'dist',
  assetsDir: 'static',
  lintOnSave: process.env.NODE_ENV === 'development',
  productionSourceMap: false,
  devServer: {
    port: port,
    open: true,
    overlay: {
      warnings: false,
      errors: true
    },
    https: true // 开启https协议
    // before: require('./mock/mock-server.js')
  },
  configureWebpack: {
    // provide the app's title in webpack's name field, so that
    // it can be accessed in index.html to inject the correct title.
    name: name,
    resolve: {
      alias: {
        '@': resolve('src')
      }
    }
  },
  chainWebpack(config) {
    // it can improve the speed of the first screen, it is recommended to turn on preload
    config.plugin('preload').tap(() => [
      {
        rel: 'preload',
        // to ignore runtime.js
        // https://github.com/vuejs/vue-cli/blob/dev/packages/@vue/cli-service/lib/config/app.js#L171
        fileBlacklist: [/\.map$/, /hot-update\.js$/, /runtime\..*\.js$/],
        include: 'initial'
      }
    ])

    // when there are many pages, it will cause too many meaningless requests
    config.plugins.delete('prefetch')

    // set svg-sprite-loader
    config.module
      .rule('svg')
      .exclude.add(resolve('src/icons'))
      .end()
    config.module
      .rule('icons')
      .test(/\.svg$/)
      .include.add(resolve('src/icons'))
      .end()
      .use('svg-sprite-loader')
      .loader('svg-sprite-loader')
      .options({
        symbolId: 'icon-[name]'
      })
      .end()

    config
      .when(process.env.NODE_ENV !== 'development',
        config => {
          config
            .plugin('ScriptExtHtmlWebpackPlugin')
            .after('html')
            .use('script-ext-html-webpack-plugin', [{
            // `runtime` must same as runtimeChunk name. default is `runtime`
              inline: /runtime\..*\.js$/
            }])
            .end()
          config
            .optimization.splitChunks({
              chunks: 'all',
              cacheGroups: {
                libs: {
                  name: 'chunk-libs',
                  test: /[\\/]node_modules[\\/]/,
                  priority: 10,
                  chunks: 'initial' // only package third parties that are initially dependent
                },
                elementUI: {
                  name: 'chunk-elementUI', // split elementUI into a single package
                  priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app
                  test: /[\\/]node_modules[\\/]_?element-ui(.*)/ // in order to adapt to cnpm
                },
                commons: {
                  name: 'chunk-commons',
                  test: resolve('src/components'), // can customize your rules
                  minChunks: 3, //  minimum common number
                  priority: 5,
                  reuseExistingChunk: true
                }
              }
            })
          // https:// webpack.js.org/configuration/optimization/#optimizationruntimechunk
          config.optimization.runtimeChunk('single')
        }
      )
  }
}

request.js:文章来源地址https://www.toymoban.com/news/detail-551101.html

import axios from 'axios'
import { Message, MessageBox } from 'element-ui'
import store from '../store'
import { getToken } from '@/utils/auth'
import {config} from "@vue/test-utils";

// 创建axios实例
const service = axios.create({
  // baseURL:process.env.VUE_APP_BASE_API,
  baseURL: "/hospitalApi", // api 的 base_url
  // baseURL: "http://suqiqaq.cn:8002", // api 的 base_url
  timeout: 10000000 // 请求超时时间
})
// http://suqiqaq.cn:8002/doc.html#/%E8%8B%8F%E4%B8%83/%E7%99%BB%E5%BD%95%E7%AE%A1%E7%90%86/loginUsingPOST
// request拦截器
service.interceptors.request.use(
  config => {
    config.headers['Content-Type'] = "application/json;charset=utf-8";
    if (store.getters.token) {
      config.headers['Authorization'] = getToken() // 让每个请求携带token
    }
    return config
  },
  error => {
    // Do something with request error
    console.log(error); // for debug
    Promise.reject(error)
  }
)

// response 拦截器
service.interceptors.response.use(
  response => {
    /**
     * code为非200是抛错 可结合自己业务进行修改
     */
    const res = response.data;
    if (res.code !== 200)
    {
      Message({
        message: res.message,
        type: 'response error',
        duration: 5 * 1000
      });
      // 408:非法的token; 400:其他客户端登录了;  401:Token 过期了;
      if (res.code === 408 || res.code === 400 || res.code === 401)
      {
        if (getToken())
        {
          MessageBox.confirm(
            '你已被登出,可以取消继续留在该页面,或者重新登录',
            '确定登出',
            {
              confirmButtonText: '重新登录',
              cancelButtonText: '取消',
              type: 'warning',
              duration: 5 * 1000
            }
          ).then(() => {
            store.dispatch('FedLogOut').then(() => {
              location.reload() // 为了重新实例化vue-router对象 避免bug
            })
          })
        }
      }
      return Promise.reject('error')
    } else
    {
      return response.data
    }
  },
  error => {
    console.log('err' + error) // for debug
    Message({
      message: error.message,
      type: 'error',
      duration: 5 * 1000
    })
    return Promise.reject(error)
  }
)

export default service

10.把前端项目上传到服务器之后即可,搞定!

到了这里,关于SpringBoot+vue2前后端项目配置ssl证书的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot配置https(SSL证书)

    第一步: 首先得明白什么是wss协议: 可以看这篇文章:WSS、SSL 和 https 之间的关系 第二步: 先拿到ssl证书:我这边是用的阿里云的免费证书具体获取方法如下: 可以参考:阿里云申请免费 SSL证书 https 的图文教程_林中明月间丶-CSDN博客_阿里云申请免费ssl证书 将下载的证书压缩包解

    2024年02月11日
    浏览(41)
  • SpringBoot项目如何部署SSL证书 (JKS格式)

    1. 获取 SSL 证书和私钥 首先,你需要获取有效的 SSL 证书和私钥。SSL 证书是一种用于加密通信的数字证书,它可以通过购买商业 SSL 证书或使用免费的 Let’s Encrypt 证书获得。请确保你拥有证书文件和与之对应的私钥文件,这通常是以 .pem 和 .key 结尾的文件或者是jks格式的,本

    2024年02月07日
    浏览(80)
  • SpringBoot+Vue前后端分离项目+云服务器(nginx配置http/https)

    目录 1.Java项目打包 2.前端项目打包 ok,项目准备好了,接下来就是服务器方面的操作了 3.服务器 1.点击控制台 2.找到 ECS云服务器 3.概览-我的资源  4.重置服务器密码  5.配置安全组 4.域名 1.买域名 2.备案  3.解析至服务器 31.控制台找到  3.2.域名列表 ,找到需要的域名,点击解析​

    2024年02月09日
    浏览(41)
  • 34、springboot切换内嵌Web服务器(Tomcat服务器)与 生成SSL证书来把项目访路径从 HTTP 配置成 HTTPS

    知识点1:springboot切换内嵌Web服务器(Tomcat服务器) 知识点2:生成SSL证书来把项目访路径从 HTTP 配置成 HTTPS spring-boot-starter-web 默认依赖 Tomcat 内置服务器 改为 Jetty 服务器 改为 Undertow 服务器 目的:把请求路径 http://xxxxx 改成 https://xxxxx 如图:原本普通的项目,启动后是http的

    2024年02月11日
    浏览(42)
  • SpringBoot配置SSL证书,开启HTTPS安全访问!!!

    一、前言 二、SpringBoot中配置SSL 1、环境 2、客户端单向认证服务端代码实战-PFX格式的证书 3、HTTP 转HTTPS 通过HTTP协议传输数据,并不会对数据进行加密,所以存在着一定的风险,容易被抓包破解数据,而且现在各种浏览器对使用HTTP协议的网站也会提示不安全。通过将HTTP协议

    2024年02月11日
    浏览(39)
  • ❤ 全面解析若依框架vue2版本(springboot-vue前后分离--前端部分)

    一般在vue项目public文件夹下命名为“favicon.ico” ❤ 处理步骤 第1步:将图标重命名为“favicon.ico”,并放在项目根目录 下。 第2步:然后在index.html中引入,title中修改页面标题。 第3步:修改build文件夹下 webpack .dev.conf.js和webpack.prod.conf.js文件中的内容。 第五步:重新已经成功

    2024年02月12日
    浏览(32)
  • 使用springboot框架Java+vue2开发的智慧班牌系统源码,SaaS云平台前后端分离架构

    智慧班牌系统可实现数字化办公,对外向学生家长提供各种服务,如:消息通知、请假管理,校园活动,学生动态,教师通讯录,学生定位等各种服务。对内向教师提供各类服务,如:班级管理,考勤管理,请假管理,活动管理,课堂点名,家长会管理,教师课程等等各种服

    2024年02月12日
    浏览(40)
  • Springboot2+vue2整合项目

    https://blog.csdn.net/m0_37613503/article/details/128961447 因为自动生成的时候没有@mapper controller service 4.1.2、整合redis 1.pom 2.yml 3.配置类 controller service mapper.xml controller service 记得打开redis 1、controller 2、分页拦截器

    2024年04月12日
    浏览(34)
  • Springboot+vue的时间管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。

    Springboot+vue的时间管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 本文设计了一个基于Springboot+vue的前后端分离的时间管理系统,采用M(model)V(

    2024年02月07日
    浏览(34)
  • 实现vue项目和springboot项目前后端数据交互

    太高版本的win7不支持 这里安装node-v12.16.2-x64.msi,指定安装位置后直接按下一步就可以。 npm是node内置的工具 这里配置npm的镜像cnpm(提高下载速度,以后用到npm的命令都可以用cnpm命令替换)不指定cnpm版本使用如下命令会报错: 错误信息: 检查错误,参照网上的对应版本图,

    2024年04月25日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包