- 博客(43)
- 收藏
- 关注
原创 仿牛客社区项目7.1——Spring Security使用示例
Spring Security:认证+授权认证:判断是否登录,账户是否存在,密码是否正确;授权 :管理员和普通用户访问不同路径的权限不同。加以配置。Spring Security作用在SpringMVC之前,多个Filter,作用也类似于SpringMVC的拦截器。如:Filter1检查验证码,Filter2检查账户密码。实体类User:方便做授权,type = 0 普通用户,type = 1 管理员 实现UserDetails接口,需要实现几个方法。public class User im.
2021-07-25 23:36:02
1004
原创 仿牛客社区项目5.3——显示系统通知(Kafka, 评论、点赞、关注后)
1、MessageMapper // 查询某个主题下最新的通知 Message selectLatestNotice(int userId, String topic); // 查询某个主题所包含的通知数量 int selectNoticeCount(int userId, String topic); // 查询未读的通知的数量 int selectNoticeUnreadCount(int userId, String topic); //.
2021-07-25 11:28:16
1149
原创 仿牛客社区项目5.2——发送系统通知(Kafka, 评论、点赞、关注后)
1、entity包下,封装时间对象:Eventpublic class Event { private String topic; private int userId; private int entityType; private int entityId; private int entityUserId; private Map<String, Object> data = new HashMap<>(); pub.
2021-07-24 17:26:28
1331
原创 仿牛客项目启动命令
redisredis-server.exe redis.windows.confredis-cli.exeshutdown exitzookeeper、kafkabin\windows\zookeeper-server-start.bat config\zookeeper.propertiesbin\windows\kafka-server-start.bat config\server.properties
2021-07-24 17:25:37
391
1
原创 仿牛客社区项目6.1——ElasticSearch入门
启动ElasticSearch,双击elasticsearch.bat(注意把jdk安装到没有空格的路径中,否则无法启动ElasticSearch,会闪退)1、命令行:C:\WINDOWS\system32>curl -X GET "localhost:9200/_cat/health?v" 检查健康状况curl -X GET "localhost:9200/_cat/nodes?v" 查看节点curl -X GET "localhost:9200/_cat/indices?v" 查看
2021-07-21 16:26:31
784
原创 仿牛客社区项目5.1——阻塞队列、Kafka入门、Springboot整合Kafka
启动zookeeper、kafka服务:D:\Environment\kafka_2.12-2.2.0>bin\windows\zookeeper-server-start.bat config\zookeeper.propertiesD:\Environment\kafka_2.12-2.2.0>bin\windows\kafka-server-start.bat config\server.properties生产者:创建主题:D:\Environment\kafka_2.1..
2021-07-20 17:33:16
730
原创 4.7仿牛客社区项目——Redis优化登录模块(存验证码、登录凭证、缓存用户信息)
1、Redis存储验证码原来是用session存验证码,现在用Redis存。首先服务器生成验证码:给某客户端生成一个随机字符串,存在客户端的cookie里。将随机字符串当作redis的key,value存生成的字符串。且redis存储的时间仅60s下次客户端输入了验证码,传给服务端:服务端取出cookie,即可到redis的key,根据key找到验证码,然后验证客户端输入的验证码code和redis里存的验证码是否一致,若一致则登录成功。key存代表各客户端的随机字符串(在客户端coo.
2021-06-27 17:13:41
1156
原创 仿牛客社区项目4.6——关注列表、粉丝列表
1、FollowService // 查询某用户关注的人 public List<Map<String, Object>> findFollowees(int userId, int offset, int limit) { String followeeKey = RedisKeyUtil.getFolloweeKey(userId, ENTITY_TYPE_USER); Set<Integer> targetIds =.
2021-06-27 14:38:40
380
原创 仿牛客社区项目4.5——Redis实现关注、取消关注(zset)
注意key、value的含义。value的数据类型是zset,有序集合,按照关注的时间排序。followee:userId:entityType -> zset(entityId,now) 某个用户关注的实体(实体包括帖子、评论、用户),按照实体分别存follower:entityType:entityId -> zset(userId,now) 某个实体拥有的粉丝(实体包括帖子、评论、用户)这个功能是异步请求。1、RedisKeyUtil还是先拼key的string...
2021-06-27 11:08:37
1147
2
原创 仿牛客社区项目4.4——Redis个人用户获得的总赞数(事务、set、string)
重点:LikeService,Redis编程式事务1、改key拼接工具类RedisKeyUtil private static final String PREFIX_USER_LIKE = "like:user"; // 某个用户的被点赞总数, value是Object->强转成Integer->intValue()转成int型 // like:user:userId -> int public static String getUserLikeKey(in.
2021-06-26 18:17:04
471
原创 仿牛客社区项目4.3——Redis实现点赞(set)
不用写数据访问层,直接在service层写即可。1、创建RedisKeyUtil工具类生成key:public class RedisKeyUtil { private static final String SPLIT = ":"; private static final String PREFIX_ENTITY_LIKE = "like:entity"; // 某个实体的赞 // like:entity:entityType:entityId -> set.
2021-06-26 16:22:08
1000
原创 仿牛客社区项目4.1,4.2——Redis入门、Spring整合Redis
常用命令:登录客户端``选择库(16个 index为0-15)select 1清空当前数据库所有的key flushdbredis-cli //登录客户端select 1 //选择库(16个 index为0-15)flushdb //清空当前数据库所有的keykeys * //查看所有的keytype test:user //查看值的类型exists test:user //查看是否有keydel test:user //删keyexpire test:students 10 //1.
2021-06-25 12:12:39
603
原创 仿牛客社区项目3.10——统一记录日志(AOP)
1、AOP上一节中统一处理Controller的异常,是通过控制器通知,当控制器异常时,统一处理。但是想记录日志,不一定有异常。而拦截器也是针对控制器的。没有对业务组件、数据访问层统一处理。想对业务层统一记录日志,而统一记录日志是系统功能,不要和业务功能混在一起实现。否则在想对记录日志的位置进行改变时,将会非常麻烦,因为业务bean有很多个,不好一个一个改。由此引入了AOP的方式,即面向切面编程,切面是一个一个组件。业务Bean是一个一个target。我们要先声明切点的位置,再通知要做什么事。只需要对
2021-06-24 20:23:36
862
原创 仿牛客社区项目3.9——统一处理异常(控制器通知@ControllerAdvice全局配置类、@ExceptionHandler统一处理异常)
SpringBoot设计,如果出现错误404或500,自动调用特定路径下的html页面(路径和名字都特定)。/templates/error/404.html、/templates/error/500.html。程序中有错误自动就调用该页面。但是错误有异步请求错误,也想同时记录日志。则使用统一处理的方式,即全局配置。使用HomeController,加获取错误页面的请求,手动重定向路径。 @RequestMapping(path = "/error", method = RequestMe..
2021-06-23 22:09:08
454
原创 仿牛客社区项目3.8——新增消息(异步请求)、变未读状态为已读
新增消息、改变已读未读状态1、数据访问层MessageMapper // 新增一个消息 int insertMessage(Message message); // 修改消息的状态 int updateStatus(List<Integer> ids, int status);xml<!-- // 新增一个消息--><!-- int insertMessage(Message message);--> &l
2021-06-22 18:16:01
447
原创 仿牛客社区项目3.7——私信列表、详情、分页(普通功能)
1、创建Message实体类public class Message { private int id; private int fromId; private int toId; private String conversationId; private String content; private int status; private Date createTime; public int getId() { r.
2021-06-22 17:07:46
814
原创 仿牛客社区项目3.6——增加评论,同时更新评论数【事务】
1、数据访问层CommentMapperint insertComment(Comment comment); <insert id="insertComment" parameterType="Comment"> insert into comment(<include refid="insertFields"></include>) values(#{userId},#{entityType},#{entityId},#.
2021-06-22 00:13:24
568
原创 仿牛客社区项目3.5——显示评论(普通功能,Controller层帖子-评论-回复)
1、实体类:Commentpublic class Comment { private int id; private int userId; private int entityType; private int entityId; private int targetId; private String content; private int status; private Date createTime; public .
2021-06-21 22:06:11
658
原创 仿牛客社区项目3.3——帖子详情(普通功能)
根据帖子的主键id查询贴子的详情内容。DiscussPostMapper接口DiscussPost selectDiscussPostById(int id);discusspost-mapper.xml<select id="selectDiscussPostById" resultType="DiscussPost"> select <include refid="selectFields"></include> from discuss_.
2021-06-18 17:01:28
503
原创 仿牛客社区项目3.2——发布帖子(异步通信技术AJAX)
异步请求:增量更新在页面上,不用刷新整个页面。通过jQuery写,三个参数:访问路径,发送的JSONString字符串,回调函数(参数是服务器返回值)一、用jQuery发送AJAX请求的示例1、取业务数据的JSON字符串先引入Fastjson jar包CommunityUtils下,getJSONStringpublic class JSONObject extends JSON implements Map<String, Object>, Cloneable, Seriali.
2021-06-18 15:39:01
810
原创 仿牛客社区项目3.1——过滤敏感词(前缀树)
根节点空,其他节点只包含一个字符。从根节点到某节点,连起来的每个路径,就是当前节点的字符串子节点不能和该节点相同敏感词:到最末节点的是敏感词敏感词构成一个前缀树3个指针:2指针一直往前走,3指针往返StringBuilder:记录非敏感词1、定义前缀树前缀树数据结构,util包下SensitiveFilter.java@Componentpublic class SensitiveFilter { // 前缀树内部类 private class TrieNode .
2021-06-17 22:54:39
866
1
原创 2.7仿牛客社区项目——账号设置(上传图片、响应图片)
1、访问账号设置页面用户相关逻辑、UserController@Controller@RequestMapping("/user")public class UserController { @RequestMapping(path = "/setting", method = RequestMethod.GET) public String getSettingPage() { return "/site/setting"; }}setting.ht.
2021-06-17 18:10:34
594
原创 2.8仿牛客社区项目——检查登录状态(自定义注解、拦截器)
需要解决的问题:防止直接在浏览器输入网址进入“登录信息设置”的网页。解决方案:设置拦截器,拦截所有请求,且在指定的方法上进行拦截。那么可以自定义注解,让拦截器只拦截带有这个自定义注解的方法。自定义注解:如何自己定义:常用的元注解有:@Target、@Retention、@Document、@Inherited(前两个必须要写)如何读取注解:Method.getDeclaredAnnotations()Method.getAnnotation(Class annotationClass)
2021-06-17 15:52:59
577
原创 2.6仿牛客社区项目———显示登录信息(拦截器、ThreadLocal)
一、为什么要用拦截器?每次请求都要显示头部信息,不同状态头部信息不同:如果登录状态,显示首页、消息、头像如果是未登录状态,显示首页、注册、登录拦截浏览器的请求,每次有请求,在开始或结束时加代码。解决通用问题,降低耦合度(拦截器和Controller没有直接的关系,所有耦合度很低。)。二、拦截器的基本使用、示例1、定义拦截器,实现HandlerInterceptor表现层的逻辑,在controller.interceptor下写Alphainterceptor.java:Handler
2021-06-16 22:51:44
1144
原创 2.5仿牛客社区项目———登录退出(创建登录凭证ticket,放入cookie)
user登录的属性id是主键ticket凭证status登录状态0有效1无效expired过期时间ticket由服务器发给浏览器,作为cookie保存在浏览器,其他信息在服务端保存。下次服务端收到了cookie识别出是来自哪个浏览器,并可取出其他信息。写程序的顺序:数据访问层->业务->表现层一、登录功能1、实体类entity:LoginTicket.class5个属性id、userId、ticket、status、expired,getset方法,重写toStringp.
2021-06-13 15:12:40
2802
2
原创 2.4仿牛客社区项目——生成验证码(放入session)
private static final Logger logger = LoggerFactory.getLogger(LoginController.class); @Autowired private Producer kaptchaProducer; @RequestMapping(path = "/kaptcha", method = RequestMethod.GET) //向浏览器输出的不是字符串也不是网页,是一个图片,需要自己用Respon...
2021-06-10 00:02:36
963
原创 JDK-JRE-JVM关系、Java语言跨平台
JDK-JRE-JVM关系JDK:Java Development Kit 开发工具包JRE:Java Runtime Environment 运行环境JVM:Java Virtual Machine 虚拟机JDK=JRE(jre)+编译器、调试器(bin)+(lib)+(include)JRE=JVM(bin)+解释器(运行类库lib)JDK:JRE:跨平台,一次编译,到处执行:.java通过javac编译成.class字节码文件,.class文件由JRE解释成机器语言,执行。不同的
2021-06-09 10:57:40
131
原创 2.3仿牛客社区项目——会话管理Cookie、Session
HTTP无状态有会话、Cookie、SessionHTTP是无状态有会话的同一个连接,服务器不记得浏览器的状态,每次请求是独立的,所以“无状态”。为了业务连续性,引入Cookie状态管理,即有会话Cookie。Cookie缺点是不安全,cookie要存到浏览器中;总是把数据发给服务器,每次访问服务器会增加数据量,对流量和性能上有影响Session服务端对象,是JavaEE标准,存在服务端安全;也会增加服务端内存压力。如果隐私,用Session存比较好Cookie浏览器 <-
2021-06-08 17:17:30
713
原创 2.2仿牛客社区项目——注册(md5加盐加密密码,发送激活路径到邮箱,激活路径由UserId和激活码组成)
访问注册功能访问注册页面LoginController.javaregister.html提交注册数据
2021-06-08 11:19:28
1092
原创 并发下的ArrayList、HashMap
并发下的ArrayList情景:两个线程各向同一个ArrayList中添加100 000个元素。可能程序正常结束抛出角标越界异常ArrayIndexOutOfBoundsException public boolean add(E e) { // 1 检查容量,如果超出要扩容 ensureCapacityInternal(size + 1); //2 添加元素 elementData[size++] = e; retur
2021-05-13 21:36:24
132
原创 从100万个数中找出最大的前100个数-最小堆、分块
题目:从N=100 0000个数中找出最大的前m=100个数最小堆1 建立m=100的最小堆,heapify方法从数组变为最小堆的复杂度为O(m)2 剩下的N-m个依次与堆顶元素比较,若大于,就替换堆顶元素,然后调整堆结构(下沉),(N-m)logm,最后堆内的元素就是所求总时间复杂度为 O(m)+O((N-m)logm)=O(Nlogm)分块+最小堆如果不能从磁盘读取那么多,可以分块,将100万分成100个1万,对每个1万进行上述操作。即O(Nlogm),N=10000,m=100.此时,每
2021-04-22 12:36:47
1180
原创 为什么在创建线程时,更推荐用实现Runnable接口的方法?而不是继承Thread类的方法?
一、继承Thread类,造Thread子类,造这个子类的对象即线程对象内部类写法:(内部类MyThread继承Thread类,给MyThread创建对象,这个对象是线程对象)Thread t1 = new MyThread();class MyThread extends Thread(){ @Override public void run(){ 想执行的任务代码 }}匿名内部类写法:Thread t1 = new Thread(){ @Override public void
2021-04-16 01:06:50
1686
原创 SecureCRT连接不上虚拟机
先ping一下虚拟机的IPping 192.168.63.129关闭虚拟机防火墙service iptables stop重新ping一下,发现收到消息了,再用SecureCRT就可以连上了
2021-04-09 19:50:42
1278
原创 java中数组为空和数组长度为0的区别
int[] nums;//声明int[] nums = null;//声明,栈中nums存的是null,不指向堆空间的对象,没有指针int[] nums = new int[0];//声明,在堆中创建了一个对象,栈中nums指向了堆,堆中为数组创建了一个0的空间语句一,不能打印nums的值语句二,栈中nums存的是null,不指向堆空间的对象,没有指针。nums.length会出现空指针异常语句三,在堆中创建了一个对象,栈中nums指向了堆,堆中为数组创建了一个0的空间。nums.length为
2021-03-06 21:55:45
824
原创 从内存解释:方法传参(基本数据类型、引用数据类型(对象、数组、String类型)),原值是否改变?
学习到宋红康String类型的一道面试题。https://www.bilibili.com/video/BV1Kb411W75N?p=455自己将其他的基本数据类型、对象作为参数,补充整理了一下。代码改为:public class StringTest { int a = 0; String str = new String("good"); char[] ch = { 't', 'e', 's', 't' }; public void change(Strin
2021-01-05 22:22:48
140
原创 教育授权certificate used to sign the license
参考link.由于之前用jar包破解过IDEA,用教育授权时候一直显示certificate used to sign the license。解决方法如下在help中找到Edit Custom VM Options…,删除#-javaagent…这一行,我的是如下这三行:#-javaagent:C:\Users\Public\.jetbrains\jetbrains-agent-v3.2.0.0f1f.69e=6e68f9eb,LFq51qqupnaiTNn39w6zATiOTxZI2JYuRJE
2020-12-28 21:51:58
592
原创 超宽带雷达P440?雷达的快时间慢时间是什么意思?
什么是快时间、慢时间?快时间:一个脉冲内采样慢时间:脉冲重复周期,每个发射的脉冲之间的间隔参数采样点数采样间隔对应频率反映什么?快时间点数n一个脉冲内采样的间隔Tf(不可改变) 61ps什么频率??1/Tf = 16.4GHz反映距离tao=nTf,d=c*tao/2慢时间点数m脉冲重复周期Ts(自己设置)80ms脉冲重复频率PRF1/Ts = 12.5Hz反映时间t=mTs注:1-20MHz的脉冲重复频率都可以。什么是超宽带?超宽带雷达,
2020-12-21 22:29:25
6790
6
原创 IDEA默认的快捷键整理!!
本科时候选修java用过一点eclipse,可是都忘差不多了,现在直接用的IDEA。以下是经常用到的IDEA默认的快捷键,再有用到的再补充吧~快捷键描述main+entermain函数sout+enterSystem.out.println()i.soutSystem.out.println(i)forifor (int i = 0; i < 5; i++) {}alt enter万能快捷键!查看接口中需要实现的抽象方法/创建对象时new构造器自
2020-12-12 14:28:40
474
1
转载 转载:java: 无效的源发行版: 14
每一步都按照该博主的检查一遍,即可解决问题https://blog.csdn.net/sunshine543123/article/details/108800733
2020-12-11 16:51:06
265
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人