博客系统 01 登录退出

2023-05-16

一、工程搭建

使用的是IDEA

(1)新建个动态web工程(Blog)

(2)导入jar包(SSH jar包)

(3)导入配置文件

​ 新建resource文件,并标记为Resources根目录。

​ 导入配置文件,并修改成本工程的数据库信息。

1472533-20190603165115738-304872625.png

(4)开启注解,开启热部署

(5)导入静态页面(web目录下)

链接: 微云链接

二、登录功能

(1)登录请求发送

1)登录页面(mgr_login.jsp)注意表单的action属性

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE HTML>
<html dir="ltr" lang="en-US">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

    <title>博客后台管理系统</title>
        <link href="../favicon.ico" rel="shortcut icon">
    <link rel="stylesheet" href="css/style.css" type="text/css" />
    </head>

    <body>
        <div id="container">
            
            <form action="${pageContext.request.contextPath}/loginAction_login.action" id="login_form">
                <div class="login">博客后台管理系统
                 <!--  <span style="color:red">用户名密码错</span> -->
                </div>
                <div class="username-text">用户名:</div>
                <div class="password-text">密码:</div>
                <div class="username-field">
                    <input type="text" name="username" value="myxq" />
                </div>
                <div class="password-field">
                    <input type="password" name="password" value="1234" />
                </div>
                <input type="checkbox" name="remember-me" id="remember-me" />
                <label for="remember-me">记住用户名</label>
                <div class="forgot-usr-pwd"></div>
                <input type="submit" name="submit" value="登录" style="font-size: 16px;margin-top:
                -1px;"/>
            </form>
        </div>
    </body>
</html>

2)struts.xml 中配置 action

<package name="struts" namespace="/" extends="struts-default">
    <action name="loginAction_*" class="" method="{1}">
        <allowed-methods>login</allowed-methods>
        <!--<allowed-methods>regex:.*</allowed-methods>-->
    </action>
</package>

3)新建Action类,并将action类的路径添加到 struts.xml 中action的class属性中

import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport {
    public String login(){
        System.out.println("来到登录action");
        return null;
    }
}
<package name="struts" namespace="/" extends="struts-default">
    <action name="loginAction_*" class="com.blog.web.LoginAction" method="{1}">
        <allowed-methods>login</allowed-methods>
        <!--<allowed-methods>regex:.*</allowed-methods>-->
    </action>
</package>

4)启动运行,输出“来到登录action”,登录请求发送成功。

5)将action交给spring管理

structs.xml

<package name="struts" namespace="/" extends="struts-default">
    <action name="loginAction_*" class="loginAction" method="{1}">
        <allowed-methods>login</allowed-methods>
        <!--<allowed-methods>regex:.*</allowed-methods>-->
    </action>
</package>

applicationContext.xml

<!-- action bean -->
<bean id="loginAction" class="com.blog.web.LoginAction" scope="prototype"/>

6)再次启动运行,输出“来到登录action”,action交给spring管理成功。

(2)登录接收参数

1)用模型驱动将参数封装成一个模型。

import lombok.Getter;
import lombok.Setter;

@Setter @Getter
public class User {
    private String username;
    private String password;

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

2)action类实现ModelDriven接口

import com.blog.domain.User;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

public class LoginAction extends ActionSupport implements ModelDriven<User> {

    private User user = new User();
    @Override
    public User getModel() {
        return user;
    }

    public String login(){
        System.out.println("来到登录action");
        System.out.println(user);
        return null;
    }
}

注意:前端静态页面表单中<input>标签的name属性的属性值要和domain的属性对应。

1472533-20190603165127279-1554989244.png

3)启动运行,输出正确参数的对象,模型驱动接收参数成功。

(3)登录三层架构搭建

1)action 中注入业务层

业务层接口:

import com.blog.domain.User;

public interface LoginService {
    public void login(User user);
}

业务层实现类:

import com.blog.Service.LoginService;
import com.blog.domain.User;

public class LoginServiceImpl implements LoginService {
    @Override
    public void login(User user) {
        System.out.println("Service: " + user);
    }
}

action中注入业务层,并将业务层交给spring管理

import com.blog.Service.LoginService;
import com.blog.domain.User;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

public class LoginAction extends ActionSupport implements ModelDriven<User> {

    private User user = new User();
    @Override
    public User getModel() {
        return user;
    }

    // 注入业务层
    private LoginService loginService;
    public void setLoginService(LoginService loginService) {
        this.loginService = loginService;
    }

    public String login(){
        System.out.println("来到登录action");
        System.out.println(user);

        // 登录业务逻辑
        loginService.login(user);

        return null;
    }
}
<!-- action bean -->
<bean id="loginAction" class="com.blog.web.LoginAction" scope="prototype">
    <property name="loginService" ref="loginService"/>
</bean>

<!-- service bean -->
<bean id="loginService" class="com.blog.Service.impl.LoginServiceImpl"/>

运行,查看效果。

2)业务层注入dao层

dao层接口:

import com.blog.domain.User;

public interface UserDao {
    User get(String username, String password);
}

dao层实现类:

import com.blog.dao.UserDao;
import com.blog.domain.User;

public class UserDaoImpl implements UserDao {
    @Override
    public User get(String username, String password) {
        System.out.println("Dao: " + username + "," + password);
        return null;
    }
}

业务层中注入dao层,并将dao层交给spring管理

import com.blog.Service.LoginService;
import com.blog.dao.UserDao;
import com.blog.domain.User;

public class LoginServiceImpl implements LoginService {

    // 注入dao层
    private UserDao userDao;
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    @Override
    public void login(User user) {
        System.out.println("Service: " + user);
        // 调用dao 查询用户
        userDao.get(user.getUsername(), user.getPassword());
    }
}
<!-- action bean -->
<bean id="loginAction" class="com.blog.web.LoginAction" scope="prototype">
    <property name="loginService" ref="loginService"/>
</bean>

<!-- service bean -->
<bean id="loginService" class="com.blog.Service.impl.LoginServiceImpl">
    <property name="userDao" ref="userDao"/>
</bean>

<!-- dao bean -->
<bean id="userDao" class="com.blog.dao.impl.UserDaoImpl">
    <!--<property name="" ref=""/>-->
</bean>

运行,查看效果。

(4)登录dao查询用户

1)创建数据库和用户表

DROP DATABASE IF EXISTS blog;
CREATE DATABASE blog DEFAULT CHARACTER SET utf8;
USE blog;

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) DEFAULT NULL,
  `password` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', 'user1', '123456');
INSERT INTO `user` VALUES ('2', 'user2', '123456');
INSERT INTO `user` VALUES ('3', 'myxq', '1234');

2)建立user表的关系映射

更新user类:

import lombok.Getter;
import lombok.Setter;

@Setter @Getter
public class User {
    private Integer id;
    private String username;
    private String password;

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

user表的关系映射文件(User.hbm.xml):

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.blog.domain.User" table="user">
        <!--建立类属性哪一个是主键 还要跟数据库当中主键进行对应 -->
        <id name="id" column="id">
            <generator class="native" />
        </id>
        <!--建立类中的普通属性与数据库当中字段进行关联 -->
        <property name="username" column="username" />
        <property name="password" column="password" />
    </class>
</hibernate-mapping>

hibernateApplication.xml(applicationContext.xml)中设置映射文件:

<!-- 设置映射文件 -->
<property name="mappingResources">
    <list>
        <value>com/blog/domain/User.hbm.xml</value>
    </list>
</property>

让UserDaoImpl继承HibernateDaoSupport

public class UserDaoImpl extends HibernateDaoSupport implements UserDao

向dao层中注入sessionFactory,applicationContext.xml中配置

<!-- dao bean -->
<bean id="userDao" class="com.blog.dao.impl.UserDaoImpl">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>

到数据库中做查询

import com.blog.dao.UserDao;
import com.blog.domain.User;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;

import java.util.List;

public class UserDaoImpl extends HibernateDaoSupport implements UserDao {
    @Override
    public User get(String username, String password) {
        System.out.println("Dao: " + username + "," + password);
        // 到数据库中做查询
        // 设置到那个表中查询
        DetachedCriteria criteria = DetachedCriteria.forClass(User.class);
        // 设置条件
        criteria.add(Restrictions.eq("username",username));
        criteria.add(Restrictions.eq("password",password));
        List<User> list = (List<User>)this.getHibernateTemplate().findByCriteria(criteria);
        System.out.println(list);
        return null;
    }
}

(5)登录结果页跳转

1)dao层返回

import com.blog.dao.UserDao;
import com.blog.domain.User;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;

import java.util.List;

public class UserDaoImpl extends HibernateDaoSupport implements UserDao {
    @Override
    public User get(String username, String password) {
        System.out.println("Dao: " + username + "," + password);
        // 到数据库中做查询
        // 设置到那个表中查询
        DetachedCriteria criteria = DetachedCriteria.forClass(User.class);
        // 设置条件
        criteria.add(Restrictions.eq("username", username));
        criteria.add(Restrictions.eq("password", password));
        List<User> list = (List<User>) this.getHibernateTemplate().findByCriteria(criteria);
        if (list.size() > 0) {
            return list.get(0);
        }
        return null;
    }
}

2)业务层返回(注意方法的返回值改变)

import com.blog.Service.LoginService;
import com.blog.dao.UserDao;
import com.blog.domain.User;

public class LoginServiceImpl implements LoginService {

    // 注入dao层
    private UserDao userDao;
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    @Override
    public User login(User user) {
        System.out.println("Service: " + user);
        // 调用dao 查询用户
        User resUser = userDao.get(user.getUsername(), user.getPassword());
        return resUser;
    }
}

3)web层返回

import com.blog.Service.LoginService;
import com.blog.domain.User;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

public class LoginAction extends ActionSupport implements ModelDriven<User> {

    private User user = new User();
    @Override
    public User getModel() {
        return user;
    }

    // 注入业务层
    private LoginService loginService;
    public void setLoginService(LoginService loginService) {
        this.loginService = loginService;
    }

    public String login(){
        System.out.println("来到登录action");
        System.out.println(user);

        // 登录业务逻辑
        User resUser = loginService.login(user);
        if (resUser == null){
            // 错误信息回显
            this.addActionError("账号或密码错误");
            // 结果页跳转
            return LOGIN;
        } else {
            // 保存用户信息
            ActionContext.getContext().getSession().put("curUser",resUser);
            // 结果页跳转
            return SUCCESS;
        }
    }
}

4)struts.xml 中配置结果页

<struts>
    <package name="struts" namespace="/" extends="struts-default">
        <action name="loginAction_*" class="loginAction" method="{1}">
            <result name="login">/mgr_login.jsp</result>
            <result name="success" type="redirect">/mgr_index.jsp</result>
            <allowed-methods>login</allowed-methods>
            <!--<allowed-methods>regex:.*</allowed-methods>-->
        </action>
    </package>
</struts>

5)错误信息回显

mgr_login.jsp中添加标签库,并添加错误回显

<%@ taglib uri="/struts-tags" prefix="s"%>

<%--错误信息回显--%>
<span style="color:red"><s:actionerror/></span>

6)显示用户名

mgr_top.jsp中添加标签库,并显示用户名

<%@ taglib uri="/struts-tags" prefix="s"%>

<%--显示用户名--%>
<span style="margin-right: 50px"><s:property value="#session.curUser.username"/></span>

三、退出功能

(1)退出请求发送

1)前端页面发送action,mgr_top.jsp:

<div class="h_top_right">
    <%--显示用户名--%>
    <span style="margin-right: 50px"><s:property value="#session.curUser.username"/></span>
    <span><a href="${pageContext.request.contextPath}/loginAction_loginout.action" target="_parent"
             style="color: lightseagreen">退出</a></span>
</div>

2)struts.xml 中配置 action

<package name="struts" namespace="/" extends="struts-default">
    <action name="loginAction_*" class="loginAction" method="{1}">
        <result name="login">/mgr_login.jsp</result>
        <result name="success" type="redirect">/mgr_index.jsp</result>
        <allowed-methods>login,loginout</allowed-methods>
        <!--<allowed-methods>regex:.*</allowed-methods>-->
    </action>
</package>

3)在LoginAction中添加loginout方法

import com.blog.Service.LoginService;
import com.blog.domain.User;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

public class LoginAction extends ActionSupport implements ModelDriven<User> {

    private User user = new User();

    @Override
    public User getModel() {
        return user;
    }

    // 注入业务层
    private LoginService loginService;

    public void setLoginService(LoginService loginService) {
        this.loginService = loginService;
    }

    public String login() {
        System.out.println("来到登录action");
        System.out.println(user);

        // 登录业务逻辑
        User resUser = loginService.login(user);
        if (resUser == null) {
            // 错误信息回显
            this.addActionError("账号或密码错误");
            // 结果页跳转
            return LOGIN;
        } else {
            // 保存用户信息
            ActionContext.getContext().getSession().put("curUser", resUser);
            // 结果页跳转
            return SUCCESS;
        }
    }

    public String loginout() {
        System.out.println("来到退出action");
        System.out.println(((User) ActionContext.getContext().getSession().get("curUser")).getUsername() + "登出");
        ActionContext.getContext().getSession().remove("curUser");
        return "login_out";
    }
}

4)退出结果页跳转,struts.xml

<package name="struts" namespace="/" extends="struts-default">
    <action name="loginAction_*" class="loginAction" method="{1}">
        <result name="login">/mgr_login.jsp</result>
        <result name="login_out" type="redirect">/mgr_login.jsp</result>
        <result name="success" type="redirect">/mgr_index.jsp</result>
        <allowed-methods>login,loginout</allowed-methods>
        <!--<allowed-methods>regex:.*</allowed-methods>-->
    </action>
</package>

转载于:https://www.cnblogs.com/xzh0717/p/10968565.html

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

博客系统 01 登录退出 的相关文章

  • 用nvm安装node后,发现npm下载总是失败的解决办法

    用nvm安装node后 xff0c 发现npm下载总是失败的解决办法 执行安装命令如下出现npm下载失败 xff0c 尝试多次都不成功 xff1a C windows system32 gt nvm install 14 17 3 Down
  • OpenStack —— DevStack一键自动化安装

    一 DevStack介绍 Devstack 目前是支持Ubuntu16 04和CentOS 7 xff0c 而且Devstack官方建议使用Ubuntu16 04 xff0c 所以我们使用Ubuntu 16 04进行安装 默认无论是Devs
  • 树莓派3b+安装

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 一 贴散热片 xff1a 背面一片 xff0c 正面两篇 二 系统安装 xff1a 1 使用SD Formatter格式化SD卡 2 使用Win32DiskImager写入
  • Amap地图轨迹

    最近在做运动相关的项目 xff0c 需要运动轨迹 xff0c 接了一下Google xff0c 头一天还能获取Location xff0c 之后就没法用了 xff0c 所以换成高德 xff0c 高德的地图包Amap 使用高德地图定位Loca
  • 实现一个最小的 CSS 响应式布局系统

    阳光里她在院子中央晾晒着衣裳 在四季的风中她散着头发安慰着时光 赵雷 南方姑娘 响应式布局系统 xff0c 在现在流行的 CSS 框架中已经非常常见了 它主要由容器类和约定一行列数的栅格系统组成 xff0c 组成了一个框架的骨架 在流行的前
  • 写了一个拖动排序插件

    drag js drag js是一款拖动排序插件 xff0c 适配pc端和手机端 demo地址 tls1234 github io drag html 结构 lt ul class 61 34 item group 34 gt lt li
  • 关于工程效能的思考

    继阿里大中台之后 xff0c 现在的科技公司大多有一支致力于提升公司研发效率和沟通协作的工程效能团队 xff0c 作为这样团队的一员 xff0c 却看到愿景和现实激烈碰撞 xff0c 不禁有如下思考 效率的提升并不能减少工作时长 就拿前端研
  • May-周记(1)

    1 封装一个ajax span class hljs comment 封装一个ajax原生写法 span span class hljs function span class hljs keyword function span span
  • 程序员从阿里、京东、美团…面试回来,这些面试题你都会吗?

    面试 xff0c 难还是不难 xff1f 最终结果好还是不好 xff1f 取决于面试者的底蕴 xff08 气场 43 技能 xff09 心态和认知以及沟通技巧 而一些主流的大型互联网公司面试 xff08 阿里巴巴 京东 美团 滴滴 xff0
  • js深拷贝和浅拷贝

    数组的深浅拷贝 浅拷贝 var arr 61 span class hljs string 34 One 34 span span class hljs string 34 Two 34 span span class hljs strin
  • OpenGL/OpenGL ES入门:纹理初探 - 常用API解析

    系列推荐文章 xff1a OpenGL OpenGL ES入门 xff1a 图形API以及专业名词解析 OpenGL OpenGL ES入门 xff1a 渲染流程以及固定存储着色器 OpenGL OpenGL ES入门 xff1a 图像渲染
  • 获取hadoop集群资源信息

    根据hadoop提供的restful接口获取 http hadoop apache org docs stable gt YARN REST APIs gt Resource Manager 1 获取每个node的信息 import url
  • java版电子商务spring cloud分布式微服务b2b2c社交电商 (八)springboot整合mongodb

    电子商务社交平台源码请加企鹅求求 xff1a 三五三六二四七二五九 准备工作 安装 MongoDBjdk 1 8maven 3 0idea 环境依赖 在pom文件引入spring boot starter data mongodb依赖 xf
  • 金丝雀发布、滚动发布、蓝绿发布到底有什么差别?关键点是什么?

    为什么80 的码农都做不了架构师 xff1f gt gt gt 根据 2017 年的 DevOps 发展报告 xff0c 高效能组织和低效能组织在软件交付的效率上有数量级上的差异 技术组织的软件交付能力是一种综合能力 xff0c 涉及众多环
  • MongoDB的无缝集成,重拾后端之Spring Boot

    MongoDB是什么 xff1f MongoDB是一个NoSQL数据库 xff0c 是NoSQL中的一个分支 xff1a 文档数据库 和传统的关系型数据库比如Oracle SQLServer和MySQL等有很大的不同 传统的关系型数据库 x
  • 关于区块链智能合约的真相

    2019独角兽企业重金招聘Python工程师标准 gt gt gt title 关于智能合约的真相 就像 区块链 xff0c AI 和 云 这样的词语一样 xff0c 智能合约 也是那些得到大量炒作的短语之一 毕竟 xff0c 没有什么比不
  • 访问者模式

    2019独角兽企业重金招聘Python工程师标准 gt gt gt https blog csdn net jason0539 article details 45146271 转载于 https my oschina net u 2511
  • zip不是内部或外部命令,也不是可执行程序”详细解决办法

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 书中第11章学习实例 xff1a 将文件备份成一个zip文件 xff08 python实现 xff09 书中源码 xff08 文件目录是自己新建文件夹的路径 xff0c 和
  • Struts2学习:HelloWorld

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 项目结构 xff1a 1 用IDEA新建一个SpringBoot 43 Maven的项目 2 新建的项目是没有webapp WEB INF 与web xml文件的 xff0
  • 泛型--继承泛型

    2019独角兽企业重金招聘Python工程师标准 gt gt gt package com atguigu javase generic import java util ArrayList import java util List im

随机推荐

  • springboot之读取配置文件

    1 propertie配置读取数据 通过value取配置文件中的数据 64 Component 64 PropertySource value 61 34 config db config properties 34 public clas
  • Kotlin与Java互操作

    1 xff0c Kotlin 调用Java import java util fun demo source List lt Int gt val list 61 ArrayList lt Int gt for item in source
  • Oracle基础和进阶笔记第二篇

    Oracle的中级操作部分 六 索引1 索引的特点2 索引的创建 七 视图1 普通视图2 物化视图 八 序列1 序列创建语法 九 触发器1 触发器的语法2 替代触发器3 系统触发器 十 游标1 一般游标创建2 静态隐式游标3 静态显示游标4
  • Python 工匠:使用装饰器的技巧。

    作者 xff1a piglei xff08 本文来自作者投稿 xff09 前言 装饰器 xff08 Decorator xff09 是 Python 里的一种特殊工具 xff0c 它为我们提供了一种在函数外部修改函数的灵活能力 它有点像一顶
  • AI听6秒语音就能知道你的长相

    声音可以暴露很多讯息 xff0c 麻省理工学院 xff08 MIT xff09 最近一项研究发现 xff0c 经过训练的 AI 不仅能从声音辨别出性别 年龄和种族 xff0c 甚至能猜出这人大概长什么样子 这些 秘密 都藏不住了 研究人员用
  • selenium编程01-简单163邮箱登陆登出_模块化

    from selenium import webdriver from time import sleep class Login def init self driver self driver 61 driver def login s
  • 163music 反爬分析

    网易163 音乐的 mp3下载 view source https music 163 com playlist id 61 924680166 这个是网页源代码 链接 中间的 拿不到具体的数据 所以获取页面的时候 要去除 http mus
  • 二层链路聚合实验

    交换机1 xff1a ystem view vlan 10 vlan 20 qu interface range g1 0 1 to g1 0 2 port link type access port access vlan 10 qu i
  • plsql

    1 添加快捷键设置 摘抄自https www cnblogs com guangxiang p 9487132 html 汉化版 xff1a 工具 首选项 用户界面 编辑器 自动替换 定义文件 英文版 xff1a Tools gt Perf
  • 如何利用python制作微信好友头像照片墙?

    这个不难 xff0c 主要用到itchat和pillow这2个库 xff0c 其中itchat用于获取微信好友头像照片 xff0c pillow用于拼接头像生成一个照片墙 xff0c 下面我简单介绍一下实现过程 xff0c 代码量不多 xf
  • 软件需求工程与UML建模第二周工作总结

    项目范围 xff1a 1 能够实现仅弹道技能的躲避训练和带有技能发射主体的技能躲避训练 2 要能够玩家自由选择角色进行训练 3 要能够实现包含技能躲避 1v1对线训练等多模式选择的训练方式 4 要能够快捷进行多次练习 xff0c 我们计划加
  • 阻塞和非阻塞~

    很清楚 先记下 https www zhihu com question 19732473 answer 14413599 转载于 https www cnblogs com Mickey697 p 10863679 html
  • vnc利用ps命令查看所有DISPLAY

    ps aux grep vnc 使用该命令可以看到详细的vnc进程和使用的DISPLAY和DISPLAY的分辨率
  • 基础数据类型的补充,编码的进阶,基础数据类型之间的转换

    1 内容总览 基础数据类型的补充数据类型之间的转换 其他数据类型转成bool值为False的情况编码的进阶 2 具体内容 数据类型的补充 str 6个 code str xff1a 补充的方法练习一遍就行 6个 s1 61 39 taiBA
  • Keepalived

    Keepalived双机热备 Keepalived简介 Keepalived是使用C语言编写的路由热备软件 xff0c 该项目软件的主要目标是为Linux系统提供简单高效的负载均衡及高可用解决方案 负载均衡架构依赖于知名的IPVS xff0
  • Scyther 形式化分析工具资料整理(三)

    1 作者Cas Cremers在做TLS1 3的时候我么发现并没有使用Scyther 形式化丰分析工具对其进行分析 xff0c 而是使用了 The Tamarin 作者建立了TLS 13的模型 那么我的目标是 使用Scyther工具对TLS
  • java产生随机数的三种方式

    public class Test public static void main String args Random类 创建随机数对象有2种 一种是添加参数 也叫种子 这种方式创建出来的数 刷新后不会改变 相当于常量了 主要方法 nex
  • gcc 编译两个so其中soA依赖soB

    有两个so xff0c 其中soB中调用soA xff1b 那么我们打包soB的时候连接soA xff1b 在打包test程序的时候连接soB 此时soB会自动查找依赖的soA xff1b 如下测试 在编译之前指定环境变量 xff1a ex
  • Vue 循环 [Vue warn]: Avoid using non-primitive value as key

    页面中不添加 xff1a key 索引的时候 xff0c 会不停的提示虚线 xff0c 但不影响使用 后来加了一个索引 xff0c 加成了 key 61 34 content 34 从后台取出来的contents是一个list xff0c
  • 博客系统 01 登录退出

    一 工程搭建 使用的是IDEA xff08 1 xff09 新建个动态web工程 xff08 Blog xff09 xff08 2 xff09 导入jar包 xff08 SSH jar包 xff09 xff08 3 xff09 导入配置文件