个人网站建立

  • 一、登录界面实现
    • 1.1 工程建立
    • 1.2 前端
    • 1.3 页面显示测试
  • 二、Shiro登录验证
    • 2.1 数据库
      • 2.1.1 数据表设计
      • 2.1.2 插入数据
      • 2.1.3 联表查看信息
    • 2.2 工程项目继续开发
      • 2.2.1 添加mybatis-plus和druid依赖
      • 2.2.2 配置数据库连接
      • 2.2.3 创建实体类
      • 2.2.4 创建一个dao并测试
      • 2.2.5 创建UsersLogin有关的接口及类
      • 2.2.6 创建UserService
    • 2.3 Shiro验证
      • 2.3.1 添加Shiro相关依赖
      • 2.3.2 创建UserRealm
      • 2.3.3 创建ShiroConfig
      • 2.3.4 创建Json返回类
      • 2.3.5 创建LoginController
      • 2.3.6 MD5加盐生成密码并保存数据库
      • 2.3.7 更改login.js的验证
      • 2.3.8 运行测试
    • 2.4 分析
      • 2.4.1 login.js分析
      • 2.4.2 js文件中log()函数分析

写在前面
本项目续 腾讯云服务器购买与配置博客,项目github网址为 链接,项目所需前端文件(HTML和JS)可以从GitHub仓库中下载获取,另外本项目按照步骤依次进行了commit,因此如果使用git clone将项目下载下来,将会得到与博客教程几乎一致的历史线,如图用IDEA打开时,观察Git,将得到如下图,因此可根据博客内容,每个小节进行检查

一、登录界面实现

1.1 工程建立

  1. 新建,加载失败的可将Server URL改成https://start.aliyun.com
  2. 选择4个初始依赖,ThymeleafTemplate Engines
  3. 等待依赖下载完成
  4. 依赖下载完成后目录结构,文件标志将变化

1.2 前端

因为还要适配移动端的页面,因此选择amazeui作为基本样式库

  1. 安装amazui样式库
    点击使用手册页面,选择版本进行下载

    解压后将assets复制到resources/static目录下
  2. 添加jQuery
    下载jquery-1.12.4.min.js,添加至resources/static/assets/js下,也可在我的github工程中下载
  3. 添加login(登陆页面),footer(网页底部),和lheader(网页头部)三个页面到resources/templates
  4. 添加页面相关的index.csstig.css两个样式文件到resources/static/style/js下,其中tig.css设置初始时“用户名或密码错误”和“客官,密码格式6-18位”两个提示不显示
  5. 添加登陆有关的login.jsbackground.jsresources/static/style/js下,
    这两个是个java scrip
    login.js主要作用为判断账号和密码是否符合有关的判断,显示有关提示
    background.js是背景有关的,实现背景的线条吸附和点按出现小心心
  6. 添加博客logo
    网页顶部显示的博客logo图片到resources/style/images下,命名为myPicture.jpg
    最终目前所有前端有关文件结构如下图所示

1.3 页面显示测试

  1. 新建controller包
    创建com.liang.modules.sys.controller

  2. 新建类
    新建TestController类,并写入,启动

    @Controller
    public class TestController {@RequestMapping("/")public String toLogin(){return "login";}
    }
    

  3. 浏览器输入http://localhost:8080/,查看界面如下

二、Shiro登录验证

2.1 数据库

2.1.1 数据表设计

创建数据库,并依次创建用户信息表、角色表、权限表、角色权限映射表

create database blog1;
use blog1;# 创建用户信息表
create table users(`id` int(11) not null auto_increment comment 'id',`username` varchar(255) not null comment '用户名',`password` varchar(60) not null comment '密码',`phone` varchar(11) not null comment '手机',`last_time` date default null comment '最后登录时间',`role_id` int(1) not null comment '角色id',primary key (`id`)
)engine=InnoDB DEFAULT CHARSET=utf8mb4;# 创建角色表
create table roles(`id` int(1) not null comment '角色id',`role_name` varchar(10) not null comment '角色名称',primary key (`id`)
)engine=InnoDB DEFAULT CHARSET=utf8mb4;# 创建权限表
create table permission(`id` int(1) not null comment '权限id',`permission_name` varchar(10) not null comment '权限名称',primary key(`id`)
)engine=InnoDB DEFAULT CHARSET=utf8mb4;# 创建角色和权限对应表
create table role_permission (`role_id` int(1) not null comment '角色id',`permission_id` int(1) not null comment '权限id',key `role_id` (`role_id`),key `permission_id` (`permission_id`)
)engine=InnoDB DEFAULT CHARSET=utf8mb4;

2.1.2 插入数据

# 插入角色表信息
insert into roles values (1, 'admin');
insert into roles values (2, 'user');
insert into roles values (3, 'partner');
# 插入权限表信息
insert into permission values (1, 'editor');
insert into permission values (2, 'manage');
insert into permission values (3, 'comment');
#插入角色和对应的权限对应关系
insert into role_permission values (1, 2);
insert into role_permission values (2, 3);
insert into role_permission values (3, 1);
# 插入用户信息
insert into users values(1, '洪城布衣','123456', '12345678910', '2021-12-22', 1);

2.1.3 联表查看信息


select u.*, r.role_name, rpn.permission_id, p.permission_name from users u
join roles r on u.role_id = r.id
join role_permission rpn on r.id = rpn.role_id
join permission p on rpn.permission_id = p.id;

如图为结果:

2.2 工程项目继续开发

2.2.1 添加mybatis-plus和druid依赖

在pom.xml的标签中添加如下

        <!--mybatis-plus配置--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.1.0</version></dependency><!--引入druid数据源--><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.14</version></dependency>

添加后,版本号或包会是红色,点Maven->再刷新,将会对相应的依赖进行下载和加载,加载完成后红色就消失,当添加其它依赖时也是这样操作,一直等待其红色消失

2.2.2 配置数据库连接

  1. 在resources下创建application.yaml和application-dev.yaml,如下图所示
  2. 在application.yaml中填写如下内容
    # 使用application的配置文件
    spring:# 配置文件 dev|test|prodprofiles:active: dev# mybatis-plus配置
    mybatis-plus:mapper-locations: classpath:mappering/*.xml#实体扫描,多个package用逗号或者分号分隔type-aliases-package: com.liang.modules.sys.entityglobal-config:db-config:table-underline: truedb-type: mysql
    
  3. 在application-dev.yaml中填写如下内容,
    server:port: 8080
    spring:datasource:username: rootpassword: 123456url: jdbc:mysql://localhost:3306/blog1?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8driver-class-name: com.mysql.cj.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSourcedruid:initial-size: 5min-idle: 5max-active: 20max-wait: 60000time-between-eviction-runs-millis: 60000min-evictable-idle-time-millis: 300000validation-query: SELECT 1 FROM DUALtest-while-idle: truetest-on-borrow: falsetest-on-return: falsepool-prepared-statements: truefilter:commons-log:connection-logger-name: stat,wall,log4jmax-pool-prepared-statement-per-connection-size: 20use-global-data-source-stat: trueconnection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
    

2.2.3 创建实体类

  1. 首先创建com.liang.modules.sys.entity包,即在modules.sys下创建entity,entity下将会存放普通实体类,在entity下继续创建com.liang.modules.sys.entity.VO包(视图对象类)
  2. 在entity下创建PermissionEntity、RoleEntity、UsersEntity三个类,VO下创建UsersVOEntity和RoleVOEntity两个类,如下图所示,图中文件名显示红色请忽略,是git有关的
  3. 各个类的主体代码如下
    @Data
    @TableName(value = "users")
    public class UsersEntity implements Serializable {private static final long serialVersionUID = 4183054704913917874L;@TableId("id")private long id;private String username;private String password;private String phone;private String lastTime;private Integer roleId;
    }@Data
    @TableName(value = "permission")
    public class PermissionEntity implements Serializable {private static final long serialVersionUID = 7501360721677209850L;private int id;private String permissionName;
    }
    @Data@TableName(value = "roles")
    public class RoleEntity implements Serializable {private static final long serialVersionUID = 7840592564845432616L;private int id;private String roleName;
    }@Data
    @TableName(value = "roles")
    public class RoleVOEntity extends RoleEntity implements Serializable {private static final long serialVersionUID = 3137462801862176163L;@TableField(exist = false)private Set<PermissionEntity> permissionSet;
    }@Data
    @TableName(value = "users")
    public class UsersVOEntity extends UsersEntity implements Serializable {private static final long serialVersionUID = -8860349534536707832L;@TableField(exist = false)private Set<RoleVOEntity> roles;
    }
    
  4. 其中每个实体类的serialVersionUID是序列化有关的,可以删除我写的,然后自己生成,生成方式如下:Idea安装 GenerateSerialVersionUID 插件,重启Idea,在类中键盘按alt+Insetrt自动生成序列化uid

2.2.4 创建一个dao并测试

  1. 创建com.liang.modules.sys.dao包
  2. 创建com.liang.modules.sys.dao.UserDao.java接口,内容如下
    @Repository
    public interface UserDao extends BaseMapper<UsersEntity> {}
    
  3. 添加包扫描
    在com.liang.TestBlog01Application前面添加
    @MapperScan("com.liang.modules.sys.dao")
    如下图所示
  4. 测试类编写
    在测试类com.liang.TestBlog01ApplicationTests中,填写测试内容,测试类所在位置可看下一步的测试
    填写内容如下,主要调用的是mybatis-plus生成的CRUD

    @SpringBootTest
    class TestBlog01ApplicationTests {@Autowiredprivate UserDao userDao;@Testvoid contextLoads() {List<UsersEntity> usersEntities = userDao.selectList(null);System.out.println(usersEntities);}
    }
    1. 测试
      按下图箭头2,运行contextLoads测试方法

      测试完成后,正常的话不报红,打印如下,将会查询users表中所有数据

2.2.5 创建UsersLogin有关的接口及类

UsersLoginDao接口、UsersLoginDao.xml、UserService接口以及UserServiceImpl实现类

  1. com.liang.modules.sys.dao.UsersLoginDao接口

    @Repository
    public interface UserLoginDao extends BaseMapper<UsersVOEntity> {UsersVOEntity findByPhone(String phone);
    }
    
  2. 在resources下新建mappering目录,并在mappering目录下新建UsersLoginDao.xml文件,内容如下
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.liang.modules.sys.dao.UserLoginDao"><resultMap id="userMap" type="com.liang.modules.sys.entity.VO.UserVOEntity"><id property="id" column="id"/><result property="username" column="username"/><result property="password" column="password"/><result property="phone" column="phone"/><result property="lastTime" column="last_time"/><collection property="roles" ofType="com.liang.modules.sys.entity.VO.RoleVOEntity"><id property="id" column="role_id"/><result property="roleName" column="role_name"/><collection property="permissionSet" ofType="com.liang.modules.sys.entity.PermissionEntity"><id property="id" column="permission_id"/><result property="permissionName" column="permission_name"/></collection></collection></resultMap><select id="findByPhone" parameterType="String" resultMap="userMap">select u.*, r.role_name, p.id as permission_id, p.permission_namefrom users ujoin roles r on u.role_id=r.idjoin role_permission rp on r.id = rp.role_idjoin permission p on p.id = rp.permission_idwhere phone=#{phone};</select>
    </mapper>
    
  3. 在测试类中加一个测试函数,并将userLoginDao注入
        @Autowiredprivate UserLoginDao userLoginDao;@Testvoid test2(){UserVOEntity byPhone = userLoginDao.findByPhone("12345678910");System.out.println(byPhone.getUsername());System.out.println(byPhone.getPassword());System.out.println("====>Roles");byPhone.getRoles().forEach(x-> System.out.println(x.getId()+" "+x.getRoleName()+ x.getPermissionSet()));}
    
  4. 运行这个测试方法
    输出如下

2.2.6 创建UserService

  1. 创建com.liang.modules.sys.service
  2. 创建com.liang.modules.sys.service.UserService接口和com.liang.modules.sys.service.impl.UserServiceImpl实现类
  3. 内容分别如下
    public interface UserService {UserVOEntity findByPhone(String phone);
    }
    
    @Service
    public class UserServiceImpl implements UserService {@Autowiredprivate UserLoginDao userLoginDao;@Overridepublic UserVOEntity findByPhone(String phone) {return userLoginDao.findByPhone(phone);}
    }
    
  4. 同理你也可以使用测试类对写的service层作一个测试
        @Autowiredprivate UserServiceImpl userServiceImpl;@Testvoid test3(){UserVOEntity byPhone = userServiceImpl.findByPhone("12345678910");System.out.println(byPhone.getUsername());System.out.println(byPhone.getPassword());System.out.println("====>Roles");byPhone.getRoles().forEach(x-> System.out.println(x.getId()+" "+x.getRoleName()+ x.getPermissionSet()));}
    

2.3 Shiro验证

2.3.1 添加Shiro相关依赖

pom.xml中添加

        <!--shiro 配置--><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring-boot-web-starter</artifactId><version>1.7.1</version></dependency><!--模板引擎thymeleaf使用shiro权限对组件进行显示控制--><dependency><groupId>com.github.theborakompanioni</groupId><artifactId>thymeleaf-extras-shiro</artifactId><version>2.0.0</version></dependency>

2.3.2 创建UserRealm

创建com.liang.modules.sys.shiro.UserRealm
暂时重写认证方法,主要内容为通过token获取到网页传来的username(其实为手机号)与密码加盐后生成编码,即内容暂时为

public class UserRealm extends AuthorizingRealm {@Autowiredprivate UserService userService;@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {return null;}@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {UsernamePasswordToken userToken = (UsernamePasswordToken) authenticationToken;UserVOEntity user = userService.findByPhone(userToken.getUsername());if (user==null){throw new UnknownAccountException("该手机号不存在!");} else {// 以手机号作为盐值进行MD5加盐ByteSource salt = ByteSource.Util.bytes(user.getPhone());return new SimpleAuthenticationInfo(user, user.getPassword(),  salt, this.getName());}}
}

2.3.3 创建ShiroConfig

创建com.liang.modules.sys.shiro.ShiroConfig

@Configuration
public class ShiroConfig {/*** 密码校验规则 HashedCredentialsMatcher* 这个Bean自动装载到Spring中,当登录认证的时候自动使用这种方式对密码进行编码,因为首先密码不会在数据库中明文保存*/@Bean("hashedCredentialsMatcher")public HashedCredentialsMatcher hashedCredentialsMatcher() {HashedCredentialsMatcher credentialsMatcher = new HashedCredentialsMatcher();//指定加密方式为MD5credentialsMatcher.setHashAlgorithmName("MD5");//加密次数credentialsMatcher.setHashIterations(1024);credentialsMatcher.setStoredCredentialsHexEncoded(true);return credentialsMatcher;}@Beanpublic ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("defaultWebSecurityManager") WebSecurityManager securityManager){ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();bean.setSecurityManager(securityManager);   // 设置安全管理器// 设置登录url映射bean.setLoginUrl("login");// 设置未授权时的跳转的请求bean.setUnauthorizedUrl("/");// 添加shiro的内置过滤器/*anon: 无需认证就可以登录authc:必须认证才能登录user: 必须拥有“记住我”这个功能perms:拥有对某个资源的权限才能访问role:拥有某个角色才能访问*/LinkedHashMap<String, String> filterMap = new LinkedHashMap<>();    //使用LinkedHashMap可以保证顺序 以便 /** anon在最后过滤// 权限授权,访问url需要权限,支持通配符filterMap.put("/", "anon");filterMap.put("/user", "authc");    // authc --   认证(登录)才能使用filterMap.put("/editor", "roles[admin]");filterMap.put("/SuperAdmin", "roles[admin]");filterMap.put("/druid/**", "anon");filterMap.put("/**", "anon");bean.setFilterChainDefinitionMap(filterMap);return bean;}//2. 获取安全管理器@Bean(name = "defaultWebSecurityManager")public DefaultWebSecurityManager defaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();securityManager.setRealm(userRealm);    //注入return securityManager;}//  1.定义userRealm进springboot组件 并配置认证加密方式@Bean(name="userRealm")public UserRealm userRealm(){UserRealm userRealm = new UserRealm();userRealm.setCredentialsMatcher(hashedCredentialsMatcher());return userRealm;}
}

2.3.4 创建Json返回类

创建com.liang.common.utils.JsonResult

@Data
@AllArgsConstructor
public class JsonResult {private Integer status; //业务相应状态private String msg;     //响应消息private Object data;    //响应数据
}

2.3.5 创建LoginController

创建com.liang.modules.sys.controller.LoginController
该部分代码主要完成登陆的验证跳转,具体流程可看后面的流程分析

@RestController
public class LoginController {@GetMapping("loginUser")public JsonResult loginUser(@RequestParam("phone") String phone,@RequestParam("password") String password,HttpSession session){UsernamePasswordToken token = new UsernamePasswordToken(phone, password);Subject subject = SecurityUtils.getSubject();try {subject.login(token);UserVOEntity user = (UserVOEntity) subject.getPrincipal();user.setPassword("");session.setAttribute("user", user);return new JsonResult(200, "ok", null);} catch (AuthenticationException e){return new JsonResult(500, "用户名或密码错误", null);}}
}

2.3.6 MD5加盐生成密码并保存数据库

创建类

public class ShiroMD5 {public static Object MD5(String phone, String password){// 与UserRealm中的认证方法一样,以手机号作为盐值进行MD5加盐ByteSource salt = ByteSource.Util.bytes(phone);// 参数分别是加密方式、待加密串(密码)、盐、加密次数// 这里的加密方式和次数要与ShiroConfig中我们写的hashedCredentialsMatcher一致return new SimpleHash("MD5", password, salt, 1024);}public static void main(String[] args) {// 保存密码到数据库的时候,可以将手机号、密码输入进来,这将生成一个加密后的字符串,// 将生成的加密字符串保存至数据库即可,下次登陆时将使用加密串进行核验System.out.println(MD5("12345678910", "123456"));}
}

运行main函数,我得到的是f878b04f4dcf4610626327d0630fc81f
在博客使用的数据库中执行如下指令更新数据库

update users
set password='f878b04f4dcf4610626327d0630fc81f'
where phone='12345678910';

2.3.7 更改login.js的验证

这里由于我们使用的手机号是12345678910,其实是没有这种12开头规范的手机号,我们将resources/static/style/js/login.js中的myreg正则表达式更改为可以匹配我们设定的手机号的
即将log函数中这个
var myreg = /^(((13[0-9]{1})|(14[0-9]{1})|(17[0]{1})|(15[0-3]{1})|(15[5-9]{1})|(18[0-9]{1}))+\d{8})$/;
改为
var myreg = /^(((12[0-9]{1})|(13[0-9]{1})|(14[0-9]{1})|(17[0]{1})|(15[0-3]{1})|(15[5-9]{1})|(18[0-9]{1}))+\d{8})$/;

2.3.8 运行测试

我在做到这里的时候出现了依赖错误,具体情况是程序报红但点进去后又不爆红了,不爆红后点运行,出现org.apache.shiro.spring.web不存在(如下图),但点进程序段又没爆红,最后是通过配置使用其他maven解决的,没出现问题可以继续往后进行

运行主启动类,即com.liang.TestBlog01Application
输入网址http://localhost:8080/

输入手机12345678910
输入密码,先随机输入一个错误的密码,例如123123,登录
提示密码错误

再输入123456,跳转到另外一个界面,并且浏览器地址栏显示为http://localhost:8080/lasturl,证明代码到此就完成了登陆的认证操作

2.4 分析

2.4.1 login.js分析

  1. 首先该文件在login.html中被加载,插入的为<script src="style/js/login.js"></script>
  2. login.js中定义了两个变量,分别为qz-login样式和notice-box样式的元素选择器,其中的样式可以在login.html中可以查看到,js就是对这些元素进行了选择
    var qzLogin = $(".qz-login");
    var noticeBox = $(".notice-box");
    
  3. login.js中定义了一个html中样式为qz-login的按钮按下的事件,查看login.html可以得知该按钮就为登录按钮,按下后就进入log()函数进行登录验证
    qzLogin.click(function () {log();
    });
    
  4. 还定义了一个密码框按键松开后的事件,功能为监测样式为pass的按键松开情况,同理查看html文件可知实际就为密码输入框,弹起后检查是否为回车键,是的话进入log()函数进行登录验证
    $(".pass").keyup(function (event) {if (event.which == "13") {log();}
    });
    
  5. 定义了一个登录函数log()

2.4.2 js文件中log()函数分析

  1. 该函数首先过滤低级错误,比如电话不符合规范,密码长度不符合等

     var phone = $("#username").val().trim();var pass = $("#password").val();var myreg = /^(((12[0-9]{1})|(13[0-9]{1})|(14[0-9]{1})|(17[0]{1})|(15[0-3]{1})|(15[5-9]{1})|(18[0-9]{1}))+\d{8})$/;if(phone.length == 0 || phone.length != 11 || !myreg.test(phone) ){$(".notice-box-res").show();} else if(pass.length < 6 || pass.length > 18){$(".notice-box-password-num").show();}
    
  2. 当基本条件符合后就进行请求,请求loginUser链接

    var str = {phone: phone, password: pass};
    $.ajax({type: "GET",url: "loginUser",// contentType: "application/x-www-form-urlencoded",contentType: "application/json",dataType: "json",data: str,
    
  3. 该链接的处理在LoginController中有定义,Controller通过调用Shiro中的SecurityUtils进行用户名和密码认证,成功返回200状态码,失败返回500状态码,并传回msg信息

     @GetMapping("loginUser")public JsonResult loginUser(@RequestParam("phone") String phone,@RequestParam("password") String password,HttpSession session){UsernamePasswordToken token = new UsernamePasswordToken(phone, password);Subject subject = SecurityUtils.getSubject();try {subject.login(token);UserVOEntity user = (UserVOEntity) subject.getPrincipal();user.setPassword("");session.setAttribute("user", user);return new JsonResult(200, "ok", null);} catch (AuthenticationException e){return new JsonResult(500, "用户名或密码错误", null);}}
    
  4. log函数成功获取到请求返回的结果后,密码错误则提示,正确则跳转至"/lasturl"页面

     success: function (data) {//放入数据if(data.status == 200){window.location.href="/lasturl";}else if(data.status == 500){$(".notice-box-res").show();setTimeout(function () {noticeBox.hide();}, 3000);}},
    

【Java】从0开始个人网站建立(一)工程建立到登录与认证-Spring boot、Shiro、Mybatis-Plus、MySql相关推荐

  1. java毕业设计融呗智慧金融微资讯移动平台服务端源码+lw文档+mybatis+系统+mysql数据库+调试

    java毕业设计融呗智慧金融微资讯移动平台服务端源码+lw文档+mybatis+系统+mysql数据库+调试 java毕业设计融呗智慧金融微资讯移动平台服务端源码+lw文档+mybatis+系统+my ...

  2. VUE+Spring Boot整合MyBatis实现前后端分离项目壁纸网站

    目录 前言 一.项目运行 二.环境需要 三.技术栈 四.项目说明 五.后端代码 前言 每次换桌面,壁纸总是不好找,搜索图片得不到好的索引与反馈,很难找到自己喜欢的壁纸,而壁纸网站可以免去我们去寻找壁纸 ...

  3. 安卓后端mysql_后端Spring Boot+前端Android交互+MySQL增删查改(Java+Kotlin实现)

    1 前言&概述 这篇文章是基于这篇文章的更新,主要是更新了一些技术栈以及开发工具的版本,还有修复了一些Bug. 本文是SpringBoot+Android+MySQL的增删查改的简单实现,用到 ...

  4. spring boot shiro redis整合基于角色和权限的安全管理-Java编程

    一.概述 本博客主要讲解spring boot整合Apache的shiro框架,实现基于角色的安全访问控制或者基于权限的访问安全控制,其中还使用到分布式缓存redis进行用户认证信息的缓存,减少数据库 ...

  5. Java项目:养老院管理系统(java+Spring Boot + SpringMVC + MyBatis+HTML+CSS+JavaScrip+ Layui+maven+mysql)

    源码获取:博客首页 "资源" 里下载! 关注公众号,带你学Java 项目介绍 : Spring Boot + SpringMVC + MyBatis+ Mysql + druid ...

  6. 通过OAuth 2.0和Okta构建具有安全的服务器到服务器通信的Spring Boot应用

    "我喜欢编写身份验证和授权代码." 〜从来没有Java开发人员. 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证. 大多数O ...

  7. 【Spring Boot+Thymeleaf+MyBatis+mysql】实现电子商务平台实战(附源码)持续更新~~ 包括sql语句、java、html代码

    源码请点赞关注收藏后评论区留言和私信博主 开发环境:Web服务器使用Servlet容器,数据库采用mysql,集成开发环境为Spring Tool Suite(STS) 一.系统设计 电子商务平台分为 ...

  8. 【Java】购买腾讯云服务器,并部署Spring boot项目,再到部署自己的个人博客,域名备案,安全连接配置

    云服务器部署 一.购买腾讯云服务器 二.简单配置 2.1 进入控制台 2.2 配置防火墙 2.3 配置访问密码 三.远程ssh登录连接服务器 四.云服务器安装软件 4.1 安装JDK 4.2 安装My ...

  9. Spring Boot 2.0.0参考手册_中文版

    Spring Boot参考文档 第一部分:Spring Boot文档 1. 关于文档 Sring参考文档可以通过html,pdf和epub 三种形式得到.最新的文档可以从docs.spring.io/ ...

  10. Spring Boot 2.0正式发布,升还是不升呢?

    Spring帝国 Spring几乎是每一位Java开发人员都耳熟能详的开发框架,不论您是一名初出茅庐的程序员还是经验丰富的老司机,都会对其有一定的了解或使用经验.在现代企业级应用架构中,Spring技 ...

最新文章

  1. 几个面试官常问的垃圾回收器,下次面试就拿这篇文章怼回去!
  2. python 之 linecache 用法记录
  3. C# 获取配置文件节点值
  4. LeetCode 831. 隐藏个人信息
  5. ASP.NET MVC4 部分视图
  6. 重塑自己的语音 笔记1
  7. 水滴公司启动医务社工高级人才培养计划
  8. C#检测ocx控件是否注册
  9. android soundpool 封装,Android中使用SoundPool来播放音频
  10. pdf转换器注册码及pdf转换器使用步骤
  11. QT QPainter
  12. 使用John the ripper破解弱密码
  13. 【剑指offer】19. 二叉树的镜像
  14. 苹果手机用计算机打不开,苹果手机更新ios11后,照片在电脑上打不开怎么办?...
  15. 【TypeScript】使用CRA创建支持TS的React项目(从踩坑到放弃)
  16. 使用pyqt弹出消息提示框
  17. MTK_android11_WIFI(内网)和4G(外网)共存
  18. 高数——换元法(2)
  19. Halcon实战 项目二 Bolb实战分析-提取图片中的硬币
  20. 电梯控制系统的实现(代码简洁优质、易懂)

热门文章

  1. PowerDNS Authoritative Server 3.3 发布
  2. 芯科技之AD7705介绍
  3. python中keyword_python的keyword模块用法实例分析
  4. 小波变换原理及傅里叶变换(极好的文章)
  5. java中集合的概念
  6. 手机和我的私生活有什么必然的联系吗?
  7. 进入Tokio的异步世界
  8. php utc 北京时间,美国各个时区转换成北京时间 utc gmt
  9. 车架号 生成 java_JAVA匹配车架号以及生成虚拟车架号
  10. 做到这几点在家也能拍出好看的证件照