Shiro认证及加盐加密

2023-05-16

目录

今天的知识是与上次所分享的知识相关联的,在Shiro入门的基础进行编写,上次之前的数据是死数据(放在Shiro.ini)而这次是活数据,可以连接到数据库,运用域Relam知识。同时出于维护用户的经济利益,保护数据的安全,我们会使用md5对密码进行加密

一、Shiro认证(ssm)

1.  导入pom依赖

2、在web容器配置文件中 配置过滤器

3、使用mybatis逆向生成工具生成我们所需要的表的model和mapper

4、在userMapper.xml中映射根据用户名查找的方法

5、在mapper与业务层中添加方法

6、自定义域 Myrealm继承域

7、配置spring与shiro的集成文件

二、密码加盐加密


今天的知识是与上次所分享的知识相关联的,在Shiro入门的基础进行编写,上次之前的数据是死数据(放在Shiro.ini)而这次是活数据,可以连接到数据库,运用域Relam知识。同时出于维护用户的经济利益,保护数据的安全,我们会使用md5对密码进行加密

一、Shiro认证(ssm)

目的:将死数据变为数据库中的数据

实现步骤:

1.  导入pom依赖

   <!--shiro依赖-->
            <dependency>
              <groupId>org.apache.shiro</groupId>
              <artifactId>shiro-core</artifactId>
              <version>1.3.2</version>
            </dependency>

            <dependency>
              <groupId>org.apache.shiro</groupId>
              <artifactId>shiro-web</artifactId>
              <version>1.3.2</version>
            </dependency>

            <dependency>
              <groupId>org.apache.shiro</groupId>
              <artifactId>shiro-spring</artifactId>
              <version>1.3.2</version>
            </dependency>

2、在web容器配置文件中 配置过滤器

过滤器的作用:拦截所有请求并交给Shiro进行处理

<!-- shiro过滤器定义 -->
  <filter>
    <filter-name>shiroFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    <init-param>
      <!-- 该值缺省为false,表示生命周期由SpringApplicationContext管理,设置为true则表示由ServletContainer管理 -->
      <param-name>targetFilterLifecycle</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>shiroFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

3、使用mybatis逆向生成工具生成我们所需要的表的model和mapper

  <table schema="" tableName="t_shiro_user" domainObjectName="User"
               enableCountByExample="false" enableDeleteByExample="false"
               enableSelectByExample="false" enableUpdateByExample="false">
        </table>

        <table schema="" tableName="t_shiro_role" domainObjectName="RoUserle"
               enableCountByExample="false" enableDeleteByExample="false"
               enableSelectByExample="false" enableUpdateByExample="false">
        </table>

        <table schema="" tableName="t_shiro_user_role" domainObjectName="Role"
               enableCountByExample="false" enableDeleteByExample="false"
               enableSelectByExample="false" enableUpdateByExample="false">
        </table>

        <table schema="" tableName="t_shiro_permission" domainObjectName="Permission"
               enableCountByExample="false" enableDeleteByExample="false"
               enableSelectByExample="false" enableUpdateByExample="false">
        </table>


        <table schema="" tableName="t_shiro_role_permission" domainObjectName="RoPermission"
               enableCountByExample="false" enableDeleteByExample="false"
               enableSelectByExample="false" enableUpdateByExample="false">
        </table>

4、在userMapper.xml中映射根据用户名查找的方法

由于我们使用md5将密码加密后,我们用户在登陆时就不需要向以前一样拿到用户密码,而是使用用户名进行查找

 <select id="queryUserByUserName" resultType="com.zjy.model.User" parameterType="java.lang.String">
    select
    <include refid="Base_Column_List" />
    from t_shiro_user
    where userName = #{userName}
  </select>

5、在mapper与业务层中添加方法

mapper

 User queryUserByUserName(@Param("user") String userName);

userbiz

package com.zjy.biz;

import com.zjy.model.User;
import org.apache.ibatis.annotations.Param;

/**
 * @author zjy
 * @site Bi8boYin
 * @company xxx公司
 * @create  2022-08-25 13:55
 */
public interface UserBiz {
    int updateByPrimaryKey(User record);int deleteByPrimaryKey(Integer userid);

    int insert(User record);

    int insertSelective(User record);

    User selectByPrimaryKey(Integer userid);

    User queryUserByUserName(@Param("user") String userName);

    int updateByPrimaryKeySelective(User record);
}

业务实现类:当我们将数据交给shiro时,spring的上下文还未加载完毕,所以需要我们将业务层添加进类注解中

package com.zjy.biz.impl;

import com.zjy.biz.UserBiz;
import com.zjy.mapper.UserMapper;
import com.zjy.model.User;
import org.springframework.stereotype.Service;

/**
 * @author zjy
 * @site Bi8boYin
 * @company xxx公司
 * @create  2022-08-25 14:00
 */
@Service("UserBiz")
public class UserBizImpl implements UserBiz {
    private UserMapper userMapper;

    @Override
    public int updateByPrimaryKey(User record) {
        return userMapper.updateByPrimaryKey(record);
    }

    @Override
    public int deleteByPrimaryKey(Integer userid) {
        return userMapper.deleteByPrimaryKey(userid);
    }

    @Override
    public int insert(User record) {
        return userMapper.insert(record);
    }

    @Override
    public int insertSelective(User record) {
        return userMapper.insertSelective(record);
    }

    @Override
    public User selectByPrimaryKey(Integer userid) {
        return userMapper.selectByPrimaryKey(userid);
    }

    @Override
    public User queryUserByUserName(String userName) {
        return userMapper.queryUserByUserName(userName);
    }

    @Override
    public int updateByPrimaryKeySelective(User record) {
        return userMapper.updateByPrimaryKeySelective(record);
    }
}

6、自定义域 Myrealm继承域

package com.zjy.shiro;

import com.zjy.biz.UserBiz;
import com.zjy.model.User;
import sun.net.www.protocol.http.AuthenticationInfo;

/**
 * @author zjy
 * @site Bi8boYin
 * @company xxx公司
 * @create  2022-08-25 14:12
 */
public class MyRealm extends AuthorizingRealm {
    private UserBiz userBiz;

    public UserBiz getUserBiz() {
        return userBiz;
    }

    public void setUserBiz(UserBiz userBiz) {
        this.userBiz = userBiz;
    }

    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        return null;
    }

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        System.out.println("身份认证...");
        String username = token.getPrincipal().toString();
        String password = token.getCredentials().toString();
        User user = userBiz.queryUserByUserName(username);
//        拿到数据库中的用户信息,放入token凭证中,用于controler进行对比
        AuthenticationInfo info = new SimpleAuthenticationInfo(
                user.getUsername(),
                user.getPassword(),
                ByteSource.Util.bytes(user.getSalt()),
                this.getName()
        );
        return info;
    }
}

7、配置spring与shiro的集成文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--配置自定义的Realm-->
    <bean id="shiroRealm" class="com.zjy.shiro.MyRealm">
        <property name="UserBiz" ref="UserBiz" />
        <!--注意:重要的事情说三次~~~~~~此处加密方式要与用户注册时的算法一致 -->
        <!--注意:重要的事情说三次~~~~~~此处加密方式要与用户注册时的算法一致 -->
        <!--注意:重要的事情说三次~~~~~~此处加密方式要与用户注册时的算法一致 -->
        <!--以下三个配置告诉shiro将如何对用户传来的明文密码进行加密-->
        <property name="credentialsMatcher">
            <bean id="credentialsMatcher" class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
                <!--指定hash算法为MD5-->
                <property name="hashAlgorithmName" value="md5"/>
                <!--指定散列次数为1024次-->
                <property name="hashIterations" value="1024"/>
                <!--true指定Hash散列值使用Hex加密存. false表明hash散列值用用Base64-encoded存储-->
                <property name="storedCredentialsHexEncoded" value="true"/>
            </bean>
        </property>
    </bean>

    <!--注册安全管理器-->
    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        <property name="realm" ref="shiroRealm" />
    </bean>

    <!--Shiro核心过滤器-->
    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <!-- Shiro的核心安全接口,这个属性是必须的 -->
        <property name="securityManager" ref="securityManager" />
        <!-- 身份验证失败,跳转到登录页面 -->
        <property name="loginUrl" value="/login"/>
        <!-- 身份验证成功,跳转到指定页面 -->
        <!--<property name="successUrl" value="/index.jsp"/>-->
        <!-- 权限验证失败,跳转到指定页面 -->
        <property name="unauthorizedUrl" value="/unauthorized.jsp"/>
        <!-- Shiro连接约束配置,即过滤链的定义 -->
        <property name="filterChainDefinitions">
            <value>
                <!--
                注:anon,authcBasic,auchc,user是认证过滤器
                    perms,roles,ssl,rest,port是授权过滤器
                -->
                <!--anon 表示匿名访问,不需要认证以及授权-->
                <!--authc表示需要认证 没有进行身份认证是不能进行访问的-->
                <!--roles[admin]表示角色认证,必须是拥有admin角色的用户才行-->
                /user/login=anon
                /user/updatePwd.jsp=authc
                /admin/*.jsp=roles[admin]
                /user/teacher.jsp=perms["user:update"]
                <!-- /css/**               = anon
                 /images/**            = anon
                 /js/**                = anon
                 /                     = anon
                 /user/logout          = logout
                 /user/**              = anon
                 /userInfo/**          = authc
                 /dict/**              = authc
                 /console/**           = roles[admin]
                 /**                   = anon-->
            </value>
        </property>
    </bean>

    <!-- Shiro生命周期,保证实现了Shiro内部lifecycle函数的bean执行 -->
    <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
</beans>

8、编写登陆的控制层代码

package com.zjy.controller;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Controller
public class LoginController {
    @RequestMapping("/login")
    public String login(HttpServletRequest req, HttpServletResponse resp){
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(username, password);
        Subject subject = SecurityUtils.getSubject();
        try {
            subject.login(usernamePasswordToken);
            req.getRequestDispatcher("main.jsp").forward(req, resp);
        } catch (Exception e) {
            req.setAttribute("message", "您的用户名密码输入有误!!!");
            try {
                req.getRequestDispatcher("login.jsp").forward(req, resp);
            } catch (ServletException e1) {
                e1.printStackTrace();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
        return null;
    }

    @RequestMapping("/logout")
    public String logout(HttpServletRequest req, HttpServletResponse resp){
        Subject subject = SecurityUtils.getSubject();
        subject.logout();
        try {
            resp.sendRedirect(req.getContextPath()+"/login.jsp");
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}

二、密码加盐加密

盐加密工具类,在做新增用户的时候使用,将加密后的密码、及加密时候的盐放入数据库;

package com.zjy.util;

import org.apache.shiro.crypto.RandomNumberGenerator;
import org.apache.shiro.crypto.SecureRandomNumberGenerator;
import org.apache.shiro.crypto.hash.SimpleHash;

public class PasswordHelper {

    /**
     * 随机数生成器
     */
    private static RandomNumberGenerator randomNumberGenerator = new SecureRandomNumberGenerator();

    /**
     * 指定hash算法为MD5
     */
    private static final String hashAlgorithmName = "md5";

    /**
     * 指定散列次数为1024次,即加密1024次
     */
    private static final int hashIterations = 1024;

    /**
     * true指定Hash散列值使用Hex加密存. false表明hash散列值用用Base64-encoded存储
     */
    private static final boolean storedCredentialsHexEncoded = true;

    /**
     * 获得加密用的盐
     *
     * @return
     */
    public static String createSalt() {
        return randomNumberGenerator.nextBytes().toHex();
    }

    /**
     * 获得加密后的凭证
     *
     * @param credentials 凭证(即密码)
     * @param salt        盐
     * @return
     */
    public static String createCredentials(String credentials, String salt) {
        SimpleHash simpleHash = new SimpleHash(hashAlgorithmName, credentials,
                salt, hashIterations);
        return storedCredentialsHexEncoded ? simpleHash.toHex() : simpleHash.toBase64();
    }


    /**
     * 进行密码验证
     *
     * @param credentials        未加密的密码
     * @param salt               盐
     * @param encryptCredentials 加密后的密码
     * @return
     */
    public static boolean checkCredentials(String credentials, String salt, String encryptCredentials) {
        return encryptCredentials.equals(createCredentials(credentials, salt));
    }

    public static void main(String[] args) {
        //盐
        String salt = createSalt();
        System.out.println(salt);
        System.out.println(salt.length());
        //凭证+盐加密后得到的密码
        String credentials = createCredentials("123", salt);
        System.out.println(credentials);
        System.out.println(credentials.length());
        boolean b = checkCredentials("123", salt, credentials);
        System.out.println(b);
    }
}

测试结果:

盐加密的运行结果:

注意看两次密码都是一样的,但是最后加密出来的结果是不一样的:这就体现了Shiro框架的安全性高

 

接下来看看md5加密后的结果:

 

加密密码123456:

当我再次打开网站时,(注意时间)去加密这个密码时,加密结果还是一样的:

 

 

 

经过以上对比,md5的加密方式和Shiro的盐加密,shiro的盐加密安全性更高!

补充:

1、简介:MD5消息摘要算法,属Hash算法一类。MD5算法对输入任意长度的消息进行运行,产生一个128位的消息摘要(32位的数字字母混合码)。

2、MD5主要特点:不可逆,相同数据的MD5值肯定一样,不同数据的MD5值不一样

3、MD5的性质:3.1、压缩性3.2、容易计算3.3、抗修改性3.4、弱抗碰撞3.5、强抗碰撞

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Shiro认证及加盐加密 的相关文章

  • Shiro采用shiro实现登录认证与权限授权管理

    Shiro 是一个 Apache 下的一开源项目项目 旨在简化身份验证和授权 spring springMVC maven shiro shiro的配置 通过maven加入shiro相关jar包 1 shiro的配置 通过maven加入sh
  • ShiroFilter设计原理与实现

    Shiro提供了与Web集成的支持 其通过一个ShiroFilter入口来拦截需要安全控制的URL 然后进行相应的控制 ShiroFilter类似于如Strut2 SpringMVC这种web框架的前端控制器 其是安全控制的入口点 其负责读
  • spring集成shiro详解

    最近项目中要用到shiro作为权限管理 以前都是用自定义的或者spring security 所以就开始看了一些网上的文章 但是感觉都写得很零散 而且大多数都只是给了几行代码 我们得项目相对比较复杂 需要进行一些额外得改造和扩展 所以自己也
  • shiro入门详解以及使用方法、shiro认证与shiro授权

    shiro介绍 什么是shiro shiro是Apache的一个开源框架 它将软件系统的安全认证相关的功能抽取出来 实现用户身份认证 权限授权 加密 会话管理等功能 组成了一个通用的安全认证框架 它可以实现如下的功能 1 验证用户 2 对用
  • Shiro学习(5)-会话管理

    1 会话管理 相关的 API 会话监听器 配置案例 2 缓存 3 记住我
  • Shiro权限框架-限制密码重试次数(8)

    1 实现原理 保证原子性 单系统 AtomicLong计数 集群系统 RedissionClient提供的RAtomicLong计数 1 获取系统中是否已有登录次数缓存 缓存对象结构预期为 用户名 登录次数 2 如果之前没有登录缓存 则创建
  • Shiro权限框架-在线并发登录人数控制(9)

    1 实现原理 在实际开发中 我们可能会遇到这样的需求 一个账号只允许同时一个在线 当账号在其他地方登陆的时候 会踢出前面登陆的账号 那我们怎么实现 自定义过滤器 继承AccessControlFilter 使用redis队列控制账号在线数目
  • 升级SpringBoot版本导致NoSuchMethodError: redis/clients/jedis/ScanResult.getStringCursor()

    今天在对SpringBoot项目升级的时候 把2 1 8 RELEASE 升级到了 2 3 2 RELEASE 2 3 2 2 4 2区间内的版本是这样 其他的springboot版本 本人没试过 运行后发现 在获取在线用户的时候 报了一个
  • springboot使用shiro的@Requiresroles注解不起作用(解决方法)

    看shiro的视频发现 Requiresroles不生效 解决方法 spring容器中 Bean public DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator DefaultAd
  • springboot整合shiro-登录失败次数限制(八)

    原文地址 转载请注明出处 https blog csdn net qq 34021712 article details 80461177 王赛超 这次讲讲如何限制用户登录尝试次数 防止坏人多次尝试 恶意暴力破解密码的情况出现 要限制用户登
  • 用户登录的详细流程(二)JWT生成token登录

    JWT生成token登录 1 jwt的构成 1 header 2 payload 3 signature 2 token的登陆原理 3 在实际中如何应用token 1 设置token的生成代码 2 如何从token中获取有用的信息 3 验证
  • 源码分析shiro认证授权流程

    1 shiro介绍 Apache Shiro是一个强大易用的Java安全框架 提供了认证 授权 加密和会话管理等功能 认证 用户身份识别 常被称为用户 登录 授权 访问控制 密码加密 保护或隐藏数据防止被偷窥 会话管理 每用户相关的时间敏感
  • Shiro权限框架-实现分布式会话SessionManager(7)

    1 会话的问题 2 分布式会话实现思路 1 原理分析 所有服务器的session信息都存储到了同一个Redis集群中 即所有的服务都将 Session 的信息存储到 Redis 集群中 无论是对 Session 的注销 更新都会同步到集群中
  • shiro框架---关于用户登录退出接口的介绍

    接上一篇文章shiro框架 shiro配置用户名和密码的注意 项目已分享到GitHub上 如果需要的可以看下 springboot shiro项目Git下载地址 在我前几篇文章里有shiro配置的文件下载包 下载后里边有四个配置文件Shir
  • 将 Shiro 的 PasswordMatcher 与自定义领域结合使用

    我使用 Apache Shiro 和自定义 JDBC 领域来从数据库中检索用户的盐 密码 哈希算法名称和哈希迭代次数 这些数据都存储为单独的列 问题是我不确定在使用 PasswordMatcher 验证用户密码与数据库中存储的密码是否匹配时
  • 将 Apache Shiro 安全库与基于 Dropwizard 的 JAX-RS 应用程序集成

    我正在尝试改变 Dropwizard 以支持 Shiro 我已阅读文档并且有点困惑 我想将 Shiro 与表单登录身份验证和 Apache Shiro 注释结合使用 我认为我需要使用 Jersey Filters 来支持 Shiro 这是在
  • 适合新手的 Apache Shiro 和 Java 安全性

    我对 Java 的安全模型几乎一无所知 包括 XML 配置 策略设置 任何安全框架组件 工具 例如密钥库等 以及介于两者之间的所有内容 虽然我明白最终会变成基本的对于我来说 卷起袖子深入学习 Java 安全性 我想知道使用 Apache S
  • Java – 高效、数据库感知的实例级授权?

    在 JPA 应用程序中 我有一个场景 其中该应用程序是 列出给定用户有权提款的所有帐户 我有帐户实体和一个多对多表 其中列出了每个用户对每个帐户拥有的授权 为了实现上述场景 应用程序当前只是内部联接两个表 这非常快 现在 我计划添加一个显式
  • Shiro/Stormpath 通过 REST

    我是新来的士郎 我们正在尝试将 Shiro 与 Stormpath 一起使用 我一直在尝试剖析这些例子 以找出我想做的解决方案 但到目前为止我还没有成功 目前 我只是尝试创建 REST 服务来执行我想要的操作 稍后我将绑定一个真正的客户端
  • 如何在生产中安全地更改会话 cookie 域或名称?

    我们最近意识到我们的会话 cookie 正在被写入我们网站的完全限定域名 www myapp com 例如 MYAPPCOOKIE 79D5DB83 domain www myapp com 我们希望将其切换为可以跨子域共享的cookie

随机推荐

  • 函数与宏定义

    前言 本文介绍函数与宏定义 一 函数的概念 1 函数的定义 自定义函数的形式 xff1a 存储类型符 返回值类型符 函数名 xff08 形参说明表 xff09 函数语句体 xff08 1 xff09 存储类型符 函数作用范围 xff0c 默
  • 51单片机-定时器中断

    目录 1 定时器 计数器 1 1 工作原理 1 2 相关寄存器 1 3 工作模式 xff08 模式1 xff09 2 中断系统 2 1 中断的概念 2 2 中断结构 2 3 中断源 2 4 相关寄存器 3 如何配置定时器中断 4 实际应用
  • 51单片机-串口通信

    目录 1 什么是通信 1 1 通信的概念 1 2 传送方式 1 3 同步方式 1 4 传送方向 1 5 校验方式 2 单片机串口介绍 2 1 硬件电路 2 2 电平标准 2 3 常见接口 2 4 内部结构 2 5 相关寄存器 2 6 工作模
  • I2C总线

    目录 1 硬件概述 1 1 常用器件 1 2 总线结构 1 3 工作原理 2 协议概述 2 1 传输格式 2 2 传输特点 2 3 读和写 2 4 时钟同步和总线仲裁 3 转换器概述 4 缓存器概述 1 硬件概述 1 1 常用器件
  • 蓝牙与WiFi

    蓝牙 透传 HAL UART Receive IT amp huart2 uint8 t amp USART2 NewData 1 开启串口2接收中断 RS485orBT 61 0 RS485orBT标志位为1时是RS485模式 xff0c
  • ubuntu 安装任意版本cmake,无须卸载

    ubuntu1804默认的cmake版本为3 10 2 xff0c 在使用中 xff0c 我们经常会遇到cmake要求更高的版本 xff0c 请读者务必不要轻易卸载原有cmake xff0c 因为这样会把之前用 cmake 编译好的包都给卸
  • 什么是结构体【详解】

    本期介绍 x1f356 主要介绍 xff1a 什么是结构体 xff0c 结构体的声明 定义 初始化 以及传参 xff0c 匿名结构体类型 xff0c 如何通过结构体来实现链表数据结构 xff0c 结构体在内存中是如何存储的 xff08 即
  • 结构体类型

    一 xff1a 结构体定义 1 C语言允许用户自己建立由不同类型的数据组成的组合型数据结构 xff0c 它称为结构体 2 一般形式 xff1a struct 结构体名 成员列表 xff1b xff08 1 xff09 struct是声明结构
  • ROS path [0]=/opt/ros/melodic/share/ros、path [1] 、path [2]

    这种错误 xff0c 我遇到是因为在运行launch前 xff0c 额外多开了roscore 解决方法 xff1a 关掉多开的roscore即可
  • word文档如何快速添加空白页

    我们有时在审阅或查看文件时 xff0c 为了编辑需要会想到插入一页的内容 xff0c 那怎么在文档中间添加空白页呢 xff0c 以最常见的speedoffice为例 首先 xff0c 用speedoffice打开一份Word文档 xff0c
  • ROS path [0]...问题

    遇到这种问题时 第一步 xff1a 首先使用rospack find 命令查找该功能包 xff0c rospack find ydlidar ros 第二部 xff1a 如果输出功能包路径则该功能包存在 xff0c 如果提示没有则说明我们需
  • Git上fork后的代码仓库如何与原仓库进行同步

    https blog csdn net wakarimasu article details 109152932 问题场景 xff1a 最近公司项目组不允许个人在远程仓库建分支 xff0c 要求每个人fork一个仓库 xff0c 以后就在自
  • Postman安装与入门简单教程

    在测试技术中 xff0c 接口测试是最基础 最重要 xff0c 也是收益最高的测试技术 xff0c 作为接口测试工具中的No 1 xff0c 一起来看看Postman是怎么入门的吧 目录 1 安装Postman2 注册Postman账号并登
  • 使用 Intel RealSense 采集图片并制作机器视觉数据集

    本文章主要涉及以下工作 xff1a xff08 1 xff09 讲述如何使用 Intel RealSense 相机采集RGB图像 深度图像 伪彩色化的深度图像以及 npy 格式保存的深度数据 xff08 2 xff09 采集到的图像可适用于
  • Postman 使用教程 - 手把手教你 API 接口测试

    Postman 教程目录 API 是什么 xff1f Postman 是什么 xff1f 一 如何安装 Postman二 API 模拟工具 GoRest三 用 Postman 发出第一个 GET 请求 1 GET 请求基本操作2 带参数的
  • Socket编程(C语言实现)——TCP协议(网络间通信AF_INET)的流式(SOCK_STREAM)+报式(SOCK_DGRAM)传输

    Socket编程 目前较为流行的网络编程模型是客户机 服务器通信模式 客户进程向服务器进程发出要求某种服务的请求 xff0c 服务器进程响应该请求 如图所示 xff0c 通常 xff0c 一个服务器进程会同时为多个客户端进程服务 xff0c
  • jQuery05插件

    一 自定义插件 1 extend 类方法 1 1对象继承 xff1a extend 对象1 xff0c 对象2 1 2 扩展jQuery类方法 extend 方法名 function xff08 xff09 方法体 getMax funct
  • JavaWeb01(web环境的搭建)

    一 JDK开发工具包 1 下载和安装jdk xff1a https www oracle com index html 2 配置环境变量 JAVA HOME JDK的安装目录 path JAVA HOME bin CLASSPATH xff
  • MySql安装与使用

    今天给大家分享的是关于mysql的安装以及使用 目录 一 mysql安装步骤 二 mysql使用 一 mysql安装步骤 1 首先我们需要下载一个mysql的压缩包 xff0c 进行解压 2 接下来改变my ini文件 修改mysql安装路
  • Shiro认证及加盐加密

    目录 今天的知识是与上次所分享的知识相关联的 xff0c 在Shiro入门的基础进行编写 xff0c 上次之前的数据是死数据 放在Shiro ini 而这次是活数据 xff0c 可以连接到数据库 xff0c 运用域Relam知识 同时出于维