- 博客(89)
- 收藏
- 关注
原创 HTTP、时间戳和重定向理解
时间戳在很多互联网公司,都会在URL后加一个时间戳,这是为了防止缓存,正常来说,加上时间戳后,这个请求会往服务器上发送一次请求。当http协议为304的时候,代表是从本地缓存中读取的数据。所以,在正常的互联网公司,发布版本的时候,js、css后都会加上一个时间戳。重定向实现原理在我们重定向的时候,当我们访问OtherServlet这个请求,请求到服务器,服务器返回,响应头状态码为302,...
2019-12-29 15:42:45 2529
原创 linux自启动脚本及解析
在/etc/profile.d/目录下创建redis_start.sh文件:#!/bin/sh#chkconfig: 2345 80 90#description:redis_start.shcd /usr/local/myredis_clusternohup sh ./redis_start.sh#!/bin/sh是指此脚本使用/bin/sh来解释执行#chkconfig: 2...
2019-12-11 19:27:20 974
原创 使用Fileter防止XSS攻击
什么是XSS攻击:XSS攻击使用Javascript脚本注入进行攻击例如在表单中注入: fromToXss.jsp:<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4...
2019-12-08 15:18:47 333
原创 表单重复提交解决方案
什么是tokentoken其实就是一个令牌,具有随机性,类似于sessionId。在对接一些第三方平台的时候,为了能够保证数据安全性,通常会使用一些令牌进行交互。from.jsp:<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!DOCTYPE...
2019-11-02 10:40:53 347
原创 cookie和session-自定义缓存类
缓存实体类:public class Cache {public Cache(String key, Object value, Long timeOut) { super(); this.key = key; this.value = value; this.timeOut = timeOut; }public Cache() {} /** * key */...
2019-11-02 10:22:17 144
原创 cookie和session
cookie和session都是用来跟踪浏览器用户身份的会话方式。区别:1、保持状态:cookie保存在浏览器端,session保存在服务器端。2、使用方式:(1)cookie机制:如果不在浏览器中设置过期时间,cookie被保存在内存中,生命周期随浏览器的关闭而结束,这种cookie简称会话cookie。如果在浏览器中设置了cookie的过期时间,cookie被保存在硬盘中,关闭浏览器后...
2019-10-20 09:50:08 229
原创 SpringbBoot学习——7——监控管理
Actuator监控应用Actuator是spring boot的一个附加功能,可帮助你在应用程序生产环境时监视和管理应用程序。可以使用HTTP的各种请求来监管,审计,收集应用的运行情况.特别对于微服务管理十分有意义.缺点:没有可视化界面Maven依赖:<parent> <groupId>org.springframework.boot</groupId&g...
2019-08-18 10:43:28 188
原创 SpringbBoot学习——6——SpringBoot热部署
热部署:比如项目的热部署,就是在应用程序在不停止的情况下,实现新的部署代码演示@RestController@Slf4jpublic class IndexController { @Value("${itmayiedu}") private String itmayieduName; @RequestMapping("/index") public String index()...
2019-08-11 10:37:34 319
原创 SpringbBoot学习——5——SpringBoot日志管理和缓存管理
使用log4j记录日志log4j.properties:#log4j.rootLogger=CONSOLE,info,error,DEBUGlog4j.rootLogger=info,error,CONSOLE,DEBUGlog4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.CONSOLE.l...
2019-08-11 10:15:29 242
原创 SpringbBoot学习——4——SpringBoot事物管理
Springboot默认集成事物,只主要在方法上加上@Transactional即可新增jta-atomikos依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jta-atomikos</artifact...
2019-08-04 15:06:18 254
原创 SpringbBoot学习——3——SpringBoot数据访问
springboot整合使用JdbcTemplatepom文件引入:<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.0.RE...
2019-08-04 11:11:47 211
原创 SpringbBoot学习——2——SpringBoot的Web开发
静态资源访问在我们开发Web应用的时候,需要引用大量的js、css、图片等静态资源。默认配置Spring Boot默认提供静态资源目录位置需置于classpath下,目录名需符合如下规则:/static/public/resources /META-INF/resources举例:我们可以在src/main/resources/目录下创建static,在该位置放置一个图片文件。启动...
2019-08-04 10:19:57 219
原创 SpringbBoot学习——1——SpringBoot快速入门
SpringBoot简介在您第1次接触和学习Spring框架的时候,是否因为其繁杂的配置而退却了?在你第n次使用Spring框架的时候,是否觉得一堆反复黏贴的配置有一些厌烦?那么您就不妨来试试使用Spring Boot来让你更易上手,更简单快捷地构建Spring应用!Spring Boot让我们的Spring应用变的更轻量化。比如:你可以仅仅依靠一个Java类来运行一个Spring引用。你也可...
2019-08-03 13:54:05 1165
原创 剑指offer——4
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。解题思路刚看题目的时候,可能会觉得这个问题很复杂,不能一下子想出解决方案。那我们就要学会把复杂的问题分解成小问题。我们求整个字符串的排列,其实可以看成两步:第一步求所有可能出现在第一个位置的字符(即把第一个字符和后面的...
2019-03-12 11:30:24 155
原创 Spring中的bean的理解
首先看一下spring中创建bean的方式1. 使用构造器创建Bean实例使用构造器来创建Bean实例是最常见的情况,如果不采用构造注入,Spring底层会调用Bean类的无参构造器来创建实例,因此要求该Bean提供无参的构造器。在这种情况下,class元素是必须的,class属性的值就是Bean实例的实现类。Spring对Bean实例的所有属性执行默认初始化,即所有基本类型为0或false,...
2019-03-11 17:02:29 91111 8
原创 spring单例和多例——如何在单例中调用多例对象
spring生成对象默认是单例的。通过scope属性可以更改为多例。<bean id="user" class="modle.User" scope="prototype"> </bean>现在有这么一种情况.User类调用一个service, 这个service又调用一个tool。有时我们希望User是多例的,service是单例的,而tool又是多例的。...
2019-03-11 15:27:38 2449
原创 剑指offer——3
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.解题思路先得到矩阵的行和列数,然后依次旋转打印数据,一次旋转打印结束后,往对角分别前进和后退一个单位。要注意单行和单列的情况。p...
2019-03-08 14:31:59 96
原创 剑指offer——2
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示解题思路如果一个整数不为0,那么这个整数至少有一位是1。如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在1后面的所有的0都会变成1(如果最右边的1后面还有0的话)。其余所有位将不会受到影响。举个例子:一个二进制数1100,从右边数起第三位是处于最右边的一个1。减去1后,第三位变成0,它后面的两位0变成了1,而...
2019-03-07 14:49:37 145
原创 剑指offer——1
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。矩阵是有序的,从左下角来看,向上数字递减,向右数字递增,因此从左下角开始查找,当要查找数字比左下角数字大时。右移要查找数字比左下角数字小时,上移。这样找的速度最快。代码实现是由左下角开始找pub...
2019-03-07 10:10:51 263
原创 二叉查找树
二叉查找树(Binary Search Tree),也称有序二叉树(ordered binary tree),排序二叉树(sorted binary tree),是指一棵空树或者具有下列性质的二叉树:若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;任意节点的左、右子树也分别为二叉查找树。...
2019-03-04 14:59:49 267
原创 背包问题—完全背包问题
完全背包问题跟01背包的区别是01背包每个物品只能选一次,总共就这几个,而完全背包问题是每个物品可以无限选,只要装得下。可以看成是有几种物品,每种都无限多个。如何根据01背包问题的分析成果来分析完全背包呢?其实很简单,01背包在选第i个物品时,容积够用情况下,只有2种状态可选,放还是不放,找出最大价值的选择。而完全背包在选第i种物品时,容积够用情况下,可能有2种以上状态可选,放1个,或者2个...
2019-03-04 12:02:40 749
原创 背包问题—01
题目有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。0-1背包问题指的是每个物品只能使用一次基本思路这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。递归方法首先我们用递归的方式来尝试解决这个问题我们用F(n,C))表示将前n nn个物品放进容量为C的背包里,得到的最大的价值。我们用自顶向下的角度来...
2019-03-04 10:12:26 161
原创 线程池和锁的深度化
Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池。在开发过程中,合理地使用线程池能够带来3个好处。第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。第三:提高线程的可管理性。线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定...
2019-03-03 10:20:57 250
原创 并发容器—3
synchronizedMapCollections.synchronized*(m) 将线程不安全额集合变为线程安全集合CountDownLatchCountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他4个任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。publi...
2019-03-03 09:15:19 146
原创 hashTabele、hashMap和conCurrentHashMap
1.HashMapHashMap 是最简单的,一来我们非常熟悉,二来就是它不支持并发操作,所以源码也非常简单。首先,我们用下面这张图来介绍 HashMap 的结构。大方向上,HashMap 里面是一个数组,然后数组中每个元素是一个单向链表。上图中,每个绿色的实体是嵌套类 Entry 的实例,Entry 包含四个属性:key, value, hash 值和用于单向链表的 next。cap...
2019-03-03 08:52:15 177
原创 同步容器类——2——HashTable和HashMap
HashMap和HashTable都是基于哈希表来实现键值映射的工具类。讨论他们的不同,我们首先来看一下他们暴露在外的API有什么不同。下面两张图,我画出了HashMap和HashTable的类继承体系,并列出了这两个类的可供外部调用的公开方法。从图中可以看出,两个类的继承体系有些不同。虽然都实现了Map、Cloneable、Serializable三个接口。但是HashMap继承自抽象类...
2019-03-01 21:08:17 141
原创 同步容器类——1——ArrayList和vector
区别与联系1.Vector是线程安全的集合类,ArrayList并不是线程安全的类。Vector类对集合的元素操作时都加了synchronized,保证线程安全。2.Vector与ArrayList本质上都是一个Object[] 数组,ArrayList提供了size属性,Vector提供了elementCount属性,他们的作用是记录集合内有效元素的个数。与我们平常调用的arrayList....
2019-03-01 20:08:57 388
原创 Java中wait和sleep方法的区别
1、两者的区别1.这两个方法来自不同的类分别是Thread和Object2.最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法(锁代码块和方法锁)。3.wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用(使用范围)4.sleep必须捕获异常,而wait,notify和notifyA...
2019-03-01 10:48:13 4656 1
原创 synchronized和lock
一.synchronized的缺陷如果一个代码块被synchronized修饰了,当一个线程获取了对应的锁,并执行该代码块时,其他线程便只能一直等待,等待获取锁的线程释放锁,而这里获取锁的线程释放锁只会有两种情况:1)获取锁的线程执行完了该代码块,然后线程释放对锁的占有;2)线程执行发生异常,此时JVM会让线程自动释放锁。那么如果这个获取锁的线程由于要等待IO或者其他原因(比如调用slee...
2019-03-01 10:34:21 143
原创 多线程之间通讯
多线程之间通讯,其实就是多个线程在操作同一个资源,但是操作的动作不同。需求:第一个线程写入(input)用户,另一个线程取读取(out)用户.实现读一个,写一个操作。共享资源源实体类class Res { public String userSex; public String userName;}输入线程资源class IntThrad extends Thread { pr...
2019-02-26 21:19:46 151
原创 深入解析volatile
一、Java内存模型想要理解volatile为什么能确保可见性,就要先理解Java中的内存模型是什么样的。Java内存模型规定了所有的变量都存储在主内存中。每条线程中还有自己的工作内存,线程的工作内存中保存了被该线程所使用到的变量(这些变量是从主内存中拷贝而来)。线程对变量的所有操作(读取,赋值)都必须在工作内存中进行。不同线程之间也无法直接访问对方工作内存中的变量,线程间变量值的传递均需要通...
2019-02-26 15:08:22 187
原创 深入剖析ThreadLocal
对ThreadLocal的理解ThreadLocal,很多地方叫做线程本地变量,也有些地方叫做线程本地存储,其实意思差不多。可能很多朋友都知道ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。这句话从字面上看起来很容易理解,但是真正理解并不是那么容易。我们还是先来看一个例子:class ConnectionManager { ...
2019-02-26 13:29:50 153
原创 多线程基础—2—多线程之间实现同步
为什么有线程安全问题?当多个线程同时共享,同一个全局变量或静态变量,做写的操作时,可能会发生数据冲突问题,也就是线程安全问题。但是做读操作是不会发生数据冲突问题。线程安全解决办法问:如何解决多线程之间线程安全问题?答:使用多线程之间同步synchronized或使用锁(lock)。问:为什么使用线程同步或使用锁能解决线程安全问题呢?答:将可能会发生数据冲突问题(线程不安全问题),只能让...
2019-02-26 13:03:34 354
原创 多线程基础—1
线程与进程区别每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。也可以把它理解为代码运行的上下文。所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务。通常由操作系统负责多个线程的调度和执行。总结:进程是所有线程的集合,每一个线程是进程中的一条执行路径。多线程创建方式第一种:继承Thread类 重写run...
2019-02-26 09:17:22 127
原创 JDK 源码阅读 Reference
Java最初只有普通的强引用,只有对象存在引用,则对象就不会被回收,即使内存不足,也是如此,JVM会爆出OOME,也不会去回收存在引用的对象。如果只提供强引用,我们就很难写出“这个对象不是很重要,如果内存不足GC回收掉也是可以的”这种语义的代码。Java在1.2版本中完善了引用体系,提供了4中引用类型:强引用,软引用,弱引用,虚引用。使用这些引用类型,我们不但可以控制垃圾回收器对对象的回收策略,...
2019-02-24 18:59:45 154
原创 JVM垃圾回收策略和算法
哪些内存需要回收?猿们都知道JVM的内存结构包括五大区域:程序计数器、虚拟机栈、本地方法栈、堆区、方法区。其中程序计数器、虚拟机栈、本地方法栈3个区域随线程而生、随线程而灭,因此这几个区域的内存分配和回收都具备确定性,就不需要过多考虑回收的问题,因为方法结束或者线程结束时,内存自然就跟随着回收了。而Java堆区和方法区则不一样。这部分内存的分配和回收是动态的,正是垃圾收集器所需关注的部分。垃圾...
2019-02-24 14:41:25 220
原创 JVM内存分配策略
Java技术体系中所提倡的自动内存管理可以归结于两个部分:给对象分配内存以及回收分配给对象的内存。我们都知道,Java对象分配,都是在Java堆上进行分配的,虽然存在JIT编译后被拆分为标量类型并简介地在栈上进行分配。如果采用分代算法,那么新生的对象是分配在新生代的Eden区上的。如果启动了本地线程分配缓冲,将按线程优先在TLAB上进行分配。事实上,Java的分配规则不是百分百固定的,其取决于...
2019-02-24 10:55:03 113
转载 JVM的类加载器
参考: https://blog.csdn.net/javazejian/article/details/73413292/类加载器的任务是根据一个类的全限定名来读取此类的二进制字节流到JVM中,然后转换为一个与目标类对应的java.lang.Class对象实例,在虚拟机提供了3种类加载器,引导(Bootstrap)类加载器、扩展(Extension)类加载器、系统(System)类加载器(也称...
2019-02-23 22:02:18 181
原创 触发JVM进行Full GC的情况及应对策略
参考 https://blog.csdn.net/chenleixing/article/details/46706039/堆内存划分为 Eden、Survivor 和 Tenured/Old 空间,如下图所示从年轻代空间(包括 Eden 和 Survivor 区域)回收内存被称为 Minor GC,对老年代GC称为Major GC,而Full GC是对整个堆来说的,在最近几个版本的JDK里...
2019-02-23 18:29:41 119
原创 JVM中对象的探秘
下面我们来详细的了解一下 HotSpot 虚拟机在 Java 堆中对象分配、布局和访问的全过程。对象的创建下图便是 Java 对象的创建过程,我建议最好是能默写出来,并且要掌握每一步在做什么类加载检查: 虚拟机遇到一条 new 指令时,首先将去检查这个指令的参数是否能在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否已被加载过、解析和初始化过。如果没有,那必须先执行相应的...
2019-02-23 16:44:53 141
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人