基于SpringMVC实现常见功能
基于SpringMVC实现常见功能
防止XSS攻击
XSS攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS是一种在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。
在后端基于SpringMVC框架过滤XSS攻击还是比较简单,只需要使用@InitBinder注解即可。
导入Jar包
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-text</artifactId><version>1.2</version>
</dependency>
过滤XSS攻击
import java.beans.PropertyEditorSupport;import org.apache.commons.text.StringEscapeUtils;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;public abstract class BaseController {@InitBinderprotected void initBinder(WebDataBinder binder){// String类型转换,将所有传递进来的String进行HTML编码,防止XSS攻击binder.registerCustomEditor(String.class, new PropertyEditorSupport() {@Overridepublic void setAsText(String text) {setValue(text == null ? null : StringEscapeUtils.escapeHtml4(text.trim()));}@Overridepublic String getAsText() {Object value = getValue();return value == null ? "" : value.toString();}});}
}
继承BaseController即可
通过上述的步骤即可过滤XSS攻击。
数据转换
很多时候,前端数据传过来,后端并不能正常接收,比如日期的格式外国人和国人习惯就是不一样的,需要转换格式,还有比如XSS攻击,后端也需要进行数据转换。
上面使用@InitBinder
添加自定义编辑器转换数据,这次主要讲如何使用WebBindingInitializer
注册全局自定义编辑器转换数据。
程序
import java.beans.PropertyEditorSupport;import org.apache.commons.text.StringEscapeUtils;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.support.WebBindingInitializer;
import org.springframework.web.context.request.WebRequest;public class TextBindingInitializer implements WebBindingInitializer {@Overridepublic void initBinder(WebDataBinder binder, WebRequest request) {binder.registerCustomEditor(String.class, new PropertyEditorSupport() {@Overridepublic void setAsText(String text) {setValue(text == null ? null : StringEscapeUtils.escapeHtml4(text.trim()));}@Overridepublic String getAsText() {Object value = getValue();return value == null ? "" : value.toString();}});}
}
配置
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"><property name="webBindingInitializer"><bean class="com.plf.base.TextBindingInitializer" /></property>
</bean>
注意
已经废弃
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter建议使用
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter
当需要使用全局处理的时候可以使用WebBindingInitializer
,如果只是局部处理那就可以使用@InitBinder
。
静态资源的配置
SpringMVC配置前端控制器的时候,一般建议配置为*.do这种方式,这是不会存在访问不到静态资源的问题,但是目前比较流行RESTful风格,就需要配置 \ ,这样就需要配置静态资源的访问路径,不然就访问不到。
第一种
在springmvc中配置:第一步需要 http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd 约束第二步配置 <mvc:default-servlet-handler />即可<mvc:default-servlet-handler />会将对静态资源的访问请求通过HandlerMapping映射到默认
Servlet请求处理器DefaultServletHttpRequestHandler对象。
而处理器调用了Tomcat的DefaultServlet来处理静态资源的访问请求。其实就是将SpringMVC不能处理的请求交给tomcat。
第二种
<servlet-mapping><servlet-name>default</servlet-name><url-pattern>*.jpg</url-pattern></servlet-mapping><servlet-mapping><servlet-name>default</servlet-name><url-pattern>*.js</url-pattern></servlet-mapping><servlet-mapping><servlet-name>default</servlet-name><url-pattern>*.css</url-pattern></servlet-mapping><servlet-mapping><servlet-name>default</servlet-name><url-pattern>*.png</url-pattern></servlet-mapping>
第三种
在springmvc.xml中配置
<mvc:resources location="/static/" mapping="/static/**"/>在spring3.0.4版本之后,Spring中定义了专门用于处理静态资源访问请求的处理器
ResourceHttpRequestHandler,并且添加了<mvc:resources />标签,专门用于解决
静态资源无法访问问题。location 表示静态资源所在目录。目录可以是WEB-INF/目录以及子目录
mapping 表示对该以资源的请求该配置会把静态资源的访问请求经HandlerMapping直接映射到
静态资源处理器对象ResourceHttpRequestHandler
集成Shiro的配置
Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、加密和会话管理。所以它用途广泛,在大部分系统中都有应用,本博客主要讲解基于Spring的配置方法。
Shiro小巧而且简单,使用方便,很适合高效编码。
学习Shiro的基本使用可以参考:http://wiki.jikexueyuan.com/project/shiro/
github上也有相关资料参考:https://github.com/zhangkaitao/shiro-example
Shiro核心组件
Subject
:表示当前的“用户”,这个用户不一定是一个具体的人,与当前应用交互的任何东西都是Subject
,比如第三方进程等SecurityManager
:安全管理器,即所有与安全有关的操作都会与SecurityManager
交互,且其管理着所有Subject
。Subject
代表了当前用户的安全操作,SecurityManager
则管理所有用户的安全操作。Realm
:安全数据源,当SecurityManager
要验证用户身份,可以从Realm
中获取用户对比其身份是否合法,也可以获取到用户的权限和验证用户操作的合法性。
基于Spring的配置方法
导入Jar包
<!-- Shiro的Jar包 -->
<dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>1.4.0</version>
</dependency>
<dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-web</artifactId><version>1.4.0</version>
</dependency>
<dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-ehcache</artifactId><version>1.4.0</version>
</dependency>
<dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring</artifactId><version>1.4.0</version>
</dependency><!-- 项目中会使用到ehcache缓存 -->
<dependency><groupId>net.sf.ehcache</groupId><artifactId>ehcache-core</artifactId><version>2.6.11</version>
</dependency>
配置Filter
在web.xml中配置Shiro的Filter
<filter><filter-name>shiroFilter</filter-name><filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class><init-param><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>
配置CacheManager缓存管理器
<!-- 配置CacheManager 缓存管理器 -->
<bean id="cacheManager"class="org.apache.shiro.cache.ehcache.EhCacheManager"><!-- 指定ehcache的配置文件 --><property name="cacheManagerConfigFile" value="classpath:ehcache-shiro.xml"/>
</bean>
其中使用到ehcache的配置,ehcache-shiro.xml用默认的配置即可
<ehcache><diskStore path="java.io.tmpdir/shiro-spring-sample"/><defaultCachemaxElementsInMemory="10000"eternal="false"timeToIdleSeconds="120"timeToLiveSeconds="120"overflowToDisk="false"diskPersistent="false"diskExpiryThreadIntervalSeconds="120"/><cache name="shiro-activeSessionCache"maxElementsInMemory="10000"eternal="true"overflowToDisk="true"diskPersistent="true"diskExpiryThreadIntervalSeconds="600"/><cache name="org.apache.shiro.realm.SimpleAccountRealm.authorization"maxElementsInMemory="100"eternal="false"timeToLiveSeconds="600"overflowToDisk="false"/></ehcache>
配置Shiro的SecurityManager
<!-- 配置Shiro的SecurityManager -->
<bean id="securityManager"class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"><property name="cacheManager" ref="cacheManager"/><!-- 配置自定义的Realm --><property name="realm" ref="myRealm"/>
</bean>
配置授权和认证的Realm
<bean id="myRealm" class="com.plf.shiro.realm.MyRealm"><property name="credentialsMatcher"><!-- 使用MD5加密 --><bean class="org.apache.shiro.authc.credential.HashedCredentialsMatcher"><property name="hashAlgorithmName" value="MD5"></property><property name="hashIterations" value="1024"></property></bean></property>
</bean>
需要自定义的Realm
import java.util.HashSet;
import java.util.Set;import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.LockedAccountException;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.crypto.hash.SimpleHash;
import org.apache.shiro.realm.AuthenticatingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.util.ByteSource;
import org.junit.Test;public class MyRealm extends AuthenticatingRealm{@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationTokentoken) throws AuthenticationException {//hashCode 一样 说明token是传值过来的System.out.println("2"+token.hashCode());System.out.println("MyRealm ---- AuthenticationInfo:"+token);//1、把AuthenticationToken强转成UsernamePasswordTokenUsernamePasswordToken upToken = (UsernamePasswordToken) token;//2、从UsernamePasswordToken中获取usernameString username = upToken.getUsername();//3、调用数据库方法,从数据库中查询username对应的用户记录System.out.println("从数据库中获取username:"+username+" 所对应的用户信息");//4、如果用户不存在,则可以抛出UnknownAccountException异常if("unknown".equals(username)){throw new UnknownAccountException("用户不存在");}//5、根据用户信息的情况,则可以抛出AuthenticationException异常if("monster".equals(username)){throw new LockedAccountException("用户锁定");}//6、根据用户情况,来构建AuthenticationInfo对象并返回//以下信息是从数据库中获取的//1) principal 认证的实体信息 可以是username 也可以是数据表对应的用户的实体类对象Object principal = username;//2) credentials 密码Object credentials="";//123456 userif("user".equals(username)){credentials="098d2c478e9c11555ce2823231e02ec1";}if("admin".equals(username)){//123456 admincredentials ="038bdaf98f2037b31f1e75b5b4c9b26e";}//3) realmName 当前realm对象的name 调用父类的getName()方法即可String realmName = getName();//4) 盐值//这里username为唯一值所以也可以做盐值,反正就是需要随机唯一值即可ByteSource credentialsSalt = ByteSource.Util.bytes(username);SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(principal,credentials,credentialsSalt,realmName);return info;}//主要是为了获取到MD5加密后的密码@Testpublic void getMD5(){String hashAlgorithmName ="MD5";Object credentials = "123456";Object salt = ByteSource.Util.bytes("user");int hashIterations = 1024;Object result = new SimpleHash(hashAlgorithmName,credentials,salt,hashIterations);System.out.println(result);}
}
配置Bean的后置处理器
<!-- 配置Bean后置处理器:会自动地调用和Spring整合的各个组件的生命周期方法可以自动的来调用配置在SpringIOC容器中Shiro bean 的生命周期方法-->
<bean id="lifecycleBeanPostProcessor"class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
启用IOC容器中使用Shiro的注解
<!-- 启用IOC容器中使用shiro的注解,但必须在配置了LifecycleBeanPostProcessor之后才能使用 -->
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor"/>
<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"><property name="securityManager" ref="securityManager"></property>
</bean>
配置Shiro的Filter
<!-- 配置 shiroFilter 该bean的id必须与web.xml文件中配置的shiro filter的name一致-->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"><!-- 装配securityManager --><property name="securityManager" ref="securityManager"/><!-- 登录页面 --><property name="loginUrl" value="/shiro-login.jsp"/><!-- 登录成功页面 --><property name="successUrl" value="/shiro-success.jsp"/><!-- 授权失败页面 --><property name="unauthorizedUrl" value="/shiro-fail.jsp"/><!-- 具体配置需要拦截哪些URL,以及访问对应的URL时使用Shiro的什么filter进行拦截 1)anon 匿名访问2)authc 认证之后(登录)才能访问的页面3)logout 登出4)user 用户拦截器 ,用户已经身份验证/记住我登录即可5) authcBasic Basic HTTP身份验证拦截器6)roles 角色授权拦截器7)perms 权限授权拦截器 验证用户是否拥有所有权限 /user/**=perms["user:create"]8)port 端口拦截器/test=port[80]9)rest rest风格拦截器 自动根据请求方法构建权限字符串10)ssl SSL拦截器 只有请求协议是https才能通过11)noSessionCreation 不创建会话拦截器--><property name="filterChainDefinitions"><value>/shiro-logout = logout# 不用认证即可访问/shiro-login = anon/shiro-login.jsp = anon/user.jsp = roles[user]/admin.jsp = roles[admin]# allow WebStart to pull the jars for the swing app:/*.jar = anon# everything else requires authentication:/** = authc</value></property>
</bean>
控制器中使用
@RequestMapping("shiro-login")
public String login(@RequestParam String username,@RequestParam String password){Subject currentUser = SecurityUtils.getSubject();if(!currentUser.isAuthenticated()){//把用户名和密码封装为UsernamePasswordToken对象UsernamePasswordToken token = new UsernamePasswordToken(username,password);token.setRememberMe(true);try{System.out.println("1"+token.hashCode());currentUser.login(token);}catch(AuthenticationException e){System.out.println("登录失败:"+e.getMessage());return "shiro-fail";}}return "shiro-success";
}
相关文章:
![](https://www.ngui.cc/images/no-images.jpg)
基于SpringMVC实现常见功能
基于SpringMVC实现常见功能 防止XSS攻击 XSS攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS是一种在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到…...
![](https://img-blog.csdnimg.cn/fe7e43b5053e4c718fde14c6a581c4d6.png)
MetInfo5.0文件包含漏洞
MetInfo历史版本与文件 环境在这里下载,使用phpstudy搭建 我们来看到这个index.php,如下图所示,其中定义了fmodule变量与module变量,其中require_once语句表示将某个文件引入当前文件,在这个代码中,通过r…...
![](https://www.ngui.cc/images/no-images.jpg)
【SpringBoot】SpringBoot实现基本的区块链的步骤与代码
以下是Spring Boot实现基本的区块链代码的步骤: 创建一个Block类,它表示一个区块,包含一个区块头和一个区块体。区块头包括版本号、时间戳、前一个区块的哈希值和当前区块的哈希值。区块体包含交易数据。 创建一个Blockchain类,它…...
![](https://img-blog.csdnimg.cn/b649ad0d9fde4ffe8bc618e3b57cbbaf.png)
Photoscan/Metashape 2.0.0中的地面激光扫描处理
在Metashape(原Photoscan)2.0.0, 结构化地面激光扫描和非结构化航空激光扫描都可以使用导入点云(文件>导入>导入点云)命令导入。导入时会保留所有点属性(包括结构化信息)。 本文讨论以下主题 如何将激光扫描数据导入项目&am…...
![](https://img-blog.csdnimg.cn/5086f6f271d84ae48e7de5c570db08b7.png)
git快速使用
1、下载git 设置签名 2、基本概念 工作区:写代码的地方。 暂存区:.git的.index 工作区:.git 3、常用操作 本地codinggit init, 初始化一个本地仓库,项目根目录下会出现个.gitgit remote add origin gitgithub.com…...
![](https://www.ngui.cc/images/no-images.jpg)
java 实现代理模式
代理模式(Proxy Pattern)是一种结构型设计模式,它允许一个对象(代理对象)充当另一个对象(被代理对象)的接口,以控制对该对象的访问。代理模式通常用于以下情况: 远程代理…...
![](https://www.ngui.cc/images/no-images.jpg)
【每日一题】力扣1768. 交替合并字符串
题目以及链接: 1768. 交替合并字符串 给你两个字符串 word1 和 word2 。请你从 word1 开始,通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长,就将多出来的字母追加到合并后字符串的末尾。 返回 合并后的字符串 。 示例 1&…...
![](https://img-blog.csdnimg.cn/fa50b9fda60f4c3b88a2d3fe0fd3b8ab.png)
vscode新建vue3文件模板
输入快捷新建的名字 enter 确认后在文件中输入以下内容 {// Place your snippets for vue here. Each snippet is defined under a snippet name and has a prefix, body and// description. The prefix is what is used to trigger the snippet and the body will be expand…...
![](https://www.ngui.cc/images/no-images.jpg)
MySql学习笔记02——MySql的简单介绍
MySQL 常用命令 注意在mysql中使用的命令需要用英文分号结尾(启动/关闭mysql服务不需要带分号) net start mysql 启动mysql服务(需要管理员启动cmd) net stop mysql关闭mysql服务(需要管理员启动cmd) m…...
![](https://img-blog.csdnimg.cn/1c6c84343f48418382ad701ac14db593.png)
mysql-1:认识mysql
文章目录 数据库概述什么是数据库什么是关系型数据库 MySQL的概述MySQL是什么MySQL发展历程 SQL的概述什么是SQLSQL发展的简要历史:SQL语言分类 数据库概述 什么是数据库 数据库就是[存储数据的仓库],其本质是一个[文件系统],数据按照特定的…...
![](https://www.ngui.cc/images/no-images.jpg)
算法通关村-----堆在查找和排序中的应用
数组中的第K个最大元素 问题描述 给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。详见le…...
![](https://www.ngui.cc/images/no-images.jpg)
直方图统计增强方法
直方图统计增强方法的原理: 直方图统计增强是一种基于像素值分布的图像增强技术,通过调整像素值的分布来增强图像的对比度和细节。其原理是根据图像的直方图信息,将原始像素值映射到一个新的像素值域,从而改变图像的亮度和对比…...
![](https://img-blog.csdnimg.cn/8ec3780465cd4bdc82f169e620028643.gif#pic_center)
字节二面:如果高性能渲染十万条数据?
前言 最近博主在字节面试中遇到这样一个面试题,这个问题也是前端面试的高频问题,作为一名前端开发工程师,我们虽然可能很少会遇到后端返回十万条数据的情况,但是了解掌握如何处理这种情况,能让你对前端性能优化有更深的…...
![](https://img-blog.csdnimg.cn/2c1d8c10763046f4833bafb6318bb688.png)
Mysql高阶语句(二)
一、设置别名(alias ——>as) 在 MySQL 查询时,当表的名字比较长或者表内某些字段比较长时,为了方便书写或者 多次使用相同的表,可以给字段列或表设置别名。使用的时候直接使用别名,简洁明了࿰…...
![](https://img-blog.csdnimg.cn/7e588b508bc94270bdd0d6450059d413.png)
算法笔记 二叉搜索树
二叉搜索树(Binary Search Tree,简称 BST)是一种数据结构,用于存储具有可比较键(通常是数字或字符串)的元素 1 结构特点 节点结构:每个节点都有一个键和两个子节点(左子节点和右子…...
![](https://www.ngui.cc/images/no-images.jpg)
微软牵手Linux:Ubuntu“系统”上架win10应用商店啦
导读继SUSE Linux登陆之后,Ubuntu今天正式以UWP应用的身份上架Win10应用商店。Windows Insider用户升级到Win10秋季创意者更新预览版Build 16190及以上就可以下载和安装Ubuntu系统应用。一旦下载和安装完Ubuntu应用后,它将开始在你的Windows10 PC上安装U…...
![](https://www.ngui.cc/images/no-images.jpg)
leetcode做题笔记126. 单词接龙 II
按字典 wordList 完成从单词 beginWord 到单词 endWord 转化,一个表示此过程的 转换序列 是形式上像 beginWord -> s1 -> s2 -> ... -> sk 这样的单词序列,并满足: 每对相邻的单词之间仅有单个字母不同。转换过程中的每个单词 s…...
![](https://www.ngui.cc/images/no-images.jpg)
windows下运行springboot的jar包,修改替换class文件,修改配置文件application,打包
在windows下跑springboot的jar包,经常会用到一些命令行和操作。 1、修改配置文件(以application.yml为例) #提取文件 jar xvf mqtt-10.1.0.jar BOOT-INF/classes/application.yml#将文件装回jar包 jar uvf mqtt-10.1.0.jar BOOT-INF/classe…...
![](https://www.ngui.cc/images/no-images.jpg)
PMD 检查java代码:可以去掉无用的括号(UselessParentheses)
这个规则的优先级比较低。 https://docs.pmd-code.org/pmd-doc-6.55.0/pmd_rules_java_codestyle.html#uselessparentheses 无用的括号可以去掉。当然,有时候为了避免理解起来困难,加上括号反而更加清晰。 例如: public static short calc…...
![](https://img-blog.csdnimg.cn/7144eeb984054b0a8da98d96d5ec04a0.jpeg)
【数据结构练习】栈的面试题集锦
目录 前言: 1.进栈过程中可以出栈的选择题 2.将递归转化为循环 3.逆波兰表达式求值 4.有效的括号 5. 栈的压入、弹出序列 6. 最小栈 前言: 数据结构想要学的好,刷题少不了,我们不仅要多刷题,还要刷好题&#x…...
![](https://img-blog.csdnimg.cn/4f2289cb9e6345fe8cb888febb18bd76.png)
简单工厂模式概述和使用
目录 一、简单工厂模式简介1. 定义2. 使用动机 二、简单工厂模式结构1.模式结构2. 时序图 三、简单工厂的使用实例四、简单工厂模式优缺点五、简单工厂模式在Java中的应用 一、简单工厂模式简介 原文链接 1. 定义 简单工厂模式(Simple Factory Pattern):又称为静…...
![](https://img-blog.csdnimg.cn/eb13950c61b64bda9bcab829f5847372.png#pic_center)
软件工程概述
软件工程概述 软件工程指的是应用计算机科学、数学及管理科学等原理,以工程化的原则和方法来解决软件问题的工程,目的是提高软件生产效率、提高软件质量、降低软件成本。 1. 计算机软件 计算机软件指的是计算机系统中的程序及其文档。程序是计算任务的…...
![](https://img-blog.csdnimg.cn/20210920142636255.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAQ0lBNzUwMA==,size_20,color_FFFFFF,t_70,g_se,x_16)
国际网页短信软件平台搭建定制接口说明|移讯云短信系统
国际网页短信软件平台搭建定制接口说明|移讯云短信系统 通道路由功能介绍 支持地区通道分流,支持关键字,关键词通道分流,支持白名单独立通道,支持全网通道分流,支持通道可发地区设置,通道路由分组&#x…...
![](https://img-blog.csdnimg.cn/4a87aa5fdf5b44d69e80872b77645aca.png)
Java“牵手”阿里巴巴店铺所有商品API接口数据,通过店铺ID获取整店商品详情数据,阿里巴巴店铺所有商品API申请指南
阿里巴巴平台店铺所有商品数据接口是开放平台提供的一种API接口,通过调用API接口,开发者可以获取阿里巴巴整店的商品的标题、价格、库存、月销量、总销量、库存、详情描述、图片、价格信息等详细信息 。 获取店铺所有商品接口API是一种用于获取电商平台…...
![](https://img-blog.csdnimg.cn/c7e22f188ff34633acece30478f86283.png)
【Sql】把数据库字段用函数根据逗号分裂成列表,然后判断列表中是否包含目标值
【Sql】把数据库字段用函数根据逗号分裂成列表,然后判断列表中是否包含目标值 【1】问题描述【2】Oracle内置函数解决【3】mysql的内置函数INSTR()【4】mysql的内置函数FIND_IN_SET() 【1】问题描述 数据库中【库信息db】和【集群信息cluster】是一对多的关系&…...
![](https://www.ngui.cc/images/no-images.jpg)
docker基本命令记录
Docker 是一个开源的容器技术,它允许开发人员将应用程序及其所有依赖项打包到一个容器中,然后轻松地在任何地方部署和运行。以下是 Docker 的一些基本操作: 基础操作: 启动 Docker:service docker start停止 Docker:service docker stop查看 Docker 信息:docker info容器操作…...
![](https://img-blog.csdnimg.cn/d235e58243dc4377b43514c3bcae50a7.png#pic_center)
web之利用延迟实现复杂动画、animation
文章目录 效果图htmlstyleJavaScript 效果图 html <div class"container"><div class"ball"></div><input type"range" min"0" max"1" step"0.01" /> </div>style body {display…...
![](https://img-blog.csdnimg.cn/5131d1c368b94eda9d18ef23338708e3.png)
TCP 和 UDP 的区别、TCP 是如何保证可靠传输的?
先来介绍一些osi七层模型 分为应用层、表示层、会话层、运输层、网络层、链路层、物理层。 应用层(数据):确定进程之间通信的性质以及满足用户需要以及提供网络和用户应用,为应用程序提供服务,DNS,HTTP,HTTPS…...
![](https://img-blog.csdnimg.cn/f68c6b086e1342b787fad4c3bb30be48.png)
鼠标悬停阴影的效果被旁边div挡住的解决办法
出现的问题 需求要求鼠标悬停某个图片上有阴影效果,但阴影被旁边相邻的div挡住了,如图所示 解决方案 给悬停的这块div增加2个css属性 $(this).css(position, relative); $(this).css(z-index, 200);新的效果如图所示 一直写后端,前端的…...
![](https://www.ngui.cc/images/no-images.jpg)
Go用两个协程交替打印100以内的奇偶数
方式1(使用无缓冲的channel) package mainimport ( "fmt" "time")var flagChan make(chan int)func wokr1() { for i : 1; i < 100; i { flagChan <- 666 // 塞入 if i%2 1 { fmt.Println("协程1打印:", i) …...
![](http://5b0988e595225.cdn.sohucs.com/images/20181012/5f683c24efd84306bee70cf583b3e8a2.png)
程序员自己做项目网站/公司网站如何推广
emcms是国内第一个开源外贸的网站管理系统,目前大多数的外贸网站都是用的semcms系统,该系统兼容许多浏览器,像IE,google,360极速浏览器都能非常好的兼容,官方semcms有php版本,asp版本,我们SINE对其安全检测的同时发现该…...
![](/images/no-images.jpg)
济南网站建设公司电子商务网站/seo 优化案例
虚拟列表示那列的数据不是存储在表中的,只有当虚拟列的值被查询时,该值被计算出来。 语法: column_name [datatype] [generated always] as (expression) [virtual] eg: salary as (round(salary*(1commission/100),2)) salary number gener…...
![](/images/no-images.jpg)
怎么创建网络平台/seo网站推广教程
mysqldump -u用戶名 -p密码 -d 数据库名 表名 > 脚本名; #导出整个数据库结构和数据 mysqldump -h localhost -uroot -p123456 database > dump.sql #导出整个多个数据库结构和数据 mysqldump -h localhost -uroot -p123456 --databases database1 database2> dump.sq…...
wordpress写插件/网络营销最基本的应用方式是什么
前言 开门见山,开篇明意。这篇博客主要讲解一下Android中ProgressBar控件以及间接继承它的两个子控件SeekBar、RatingBar的基本用法,因为其有继承关系,存在一些共有特性,所以在一篇博客中讲解。下面先简单描述一下这三个控件&…...
![](/images/no-images.jpg)
做课件可赚钱的网站/品牌推广公司
简单地说,那些被virtual关键字修饰的成员函数,就是虚函数。 首先:强调一个概念定义一个函数为虚函数,不代表函数为不被实现的函数。定义他为虚函数是为了允许用基类的指针来调用子类的这个函数。定义一个函数为纯虚函数࿰…...
![](http://pic.w-blog.cn/6A1EEA85-AB15-459B-A22D-FE741DAC03E1.png)
南昌网站建设方案详细版/哈尔滨seo公司
2019独角兽企业重金招聘Python工程师标准>>> 日常的大数据使用中经常是在服务器命名行中进行操作,可视化功能仅仅依靠着各个组件自带的网页进行,那么有没有一个可以结合大家能在一个网页上的管理工具呢?答案是肯定的,今天就和大家一起来探索大数据管理工具HUE的庐山…...