0%

0.jpg

前言

相比有做过企业级开发的童鞋应该都有做过权限安全之类的功能吧,最先开始我采用的是建用户表,角色表,权限表,之后在拦截器中对每一个请求进行拦截,再到数据库中进行查询看当前用户是否有该权限,这样的设计能满足大多数中小型系统的需求。不过这篇所介绍的Shiro能满足之前的所有需求,并且使用简单,安全性高,而且现在越来越的多企业都在使用Shiro,这应该是一个收入的你的技能库。


创建自定义MyRealm

有关Shiro的基础知识我这里就不过多介绍了,直接来干货,到最后会整合Spring来进行权限验证。
首先在使用Shiro的时候我们要考虑在什么样的环境下使用:

  • 登录的验证
  • 对指定角色的验证
  • 对URL的验证
Read more »

pexels-photo-257875.jpeg

前言

大家平时肯定都有用过全文检索工具,最常用的百度谷歌就是其中的典型。如果自己能够做一个那是不是想想就逼格满满呢。Apache就为我们提供了这样一个框架,以下就是在实际开发中加入Lucene的一个小Demo。


获取Maven依赖

首先看一下实际运行的效果图:

Read more »

ssmo1.jpeg

前言

最近这几年JetBrains公司开发的IDEA是越来越流行了,甚至Google的官方IDE都是IDEA来定制的,可见IDEA的发展趋势是越来越好,由于博主接触IDEA的时间也不长,所以有关IDEAEclipse的区别和优劣势请自行百度了。
借此机会我就使用IDEA来整合一下SSM,针对于初学者(初次使用IDEA和JAVAEE初学者)还是有帮助的。


新建SSM项目

哦对了,关于IDEA的版本问题强烈建议使用旗舰版,有条件的就购买,没条件的嘛。。天朝你懂的。
在欢迎界面点击Create New Project

Read more »

前言

由于博主的喜新厌旧,再经过一段时间对上一个主题的审美疲劳加上我专(zhuang)研(bi)的精神
于是就想找一个B格较高的主题。经过一段时间的查找发现NexT这个主题简洁而不失华丽,低调而不失逼格(就不收广告费了)特别适合我,接着就着手开干。


安装NexT主题

从Git上克隆主题

这里我就不介绍有关Hexo的东西了,默认是知道如何搭建Hexo博客的。还不太清楚的请自行百度。
首先将NexT主题先克隆到自己电脑上:

  • cd your-hexo-site
  • git clone https://github.com/iissnan/hexo-theme-next themes/next

安装主题

接下来我们只需要将站点下的_config.yml配置文件中的主题配置更换成Next,如下图:

其实这样主题就配好了,是不是很简单

Read more »

前言

相信很多朋友在实际工作中都会要将数据导出成Excel的需求,通常这样的做法有两种。
一是采用JXL来生成Excel,之后保存到服务器,然后在生成页面之后下载该文件。
二是使用POI来生成Excel,之后使用Stream的方式输出到前台直接下载(ps:当然也可以生成到服务器中再下载。)。这里我们讨论第二种。
*至于两种方式的优缺点请自行百度*。


Struts2的方式

通常我会将已经生成好的HSSFWorkbook放到一个InputStream中,然后再到xml配置文件中将返回结果更改为stream的方式。如下:

1
2
3
4
5
6
7
8
private void responseData(HSSFWorkbook wb) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
wb.write(baos);
baos.flush();
byte[] aa = baos.toByteArray();
excelStream = new ByteArrayInputStream(aa, 0, aa.length);
baos.close();
}
Read more »

前言

由于前段时间为了让部署在Linux中的项目访问另一台服务器的MySQL,经过各种折腾就把root用户给弄出问题了,导致死活登不上PS:Linux中的项目还是没有连上。。(这是后话了。)。经过各种查阅资料终于找到解决方法了。

报错如下:
Access denied for user 'root'@'localhost' (using password:YES)


关闭MySQL服务,修改MySQL初始文件

打开MySQL目录下的my-default.ini文件,如图:

在最后一行加入skip-grant-tables之后保存。
然后重启MySQL服务。

Read more »

前言

之前我们使用多线程要么是继承Thread类,要么是实现Runnable接口,然后重写一下run()方法即可。
但是只有的话如果有死锁、对共享资源的访问和随时监控线程状态就不行了,于是在Java5之后就有了Callable接口。


简单的实现有返回值的线程

代码如下:
CallableFuture

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package top.crosssoverjie.study.Thread;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class CallableFuture {
public static void main(String[] args) {
//创建一个线程池
ExecutorService pool = Executors.newFixedThreadPool(3) ;

//创建三个有返回值的任务
CallableTest2 c1 = new CallableTest2("线程1") ;
CallableTest2 c2 = new CallableTest2("线程2") ;
CallableTest2 c3 = new CallableTest2("线程3") ;

Future f1 = pool.submit(c1) ;
Future f2 = pool.submit(c2) ;
Future f3 = pool.submit(c3) ;

try {
System.out.println(f1.get().toString());
System.out.println(f2.get().toString());
System.out.println(f3.get().toString());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}finally{
pool.shutdown();
}

}
}
Read more »

前言

花了几天时间终于把这个看似高大上的博客搞好了,但是发现只能通过在地址栏输入地址进行访问,这很明显和我装X装到底的性格,于是乎在查阅了嘟爷的博客,和我各种百度终于搞出来了。


让谷歌收录

让谷歌收录还是比较简单,首先我们肯定是要翻墙的(这个就不仔细说了,具体百度。)
由于我这里突然登不上google账号了,所以下次补充截图。同体来说就是以下步骤:

  • 下载google的html验证文件放到网站的根目录,使google能够访问得到。
  • 在谷歌站长工具里加上自己的站点地图。
Read more »

前言

本文主要讲解java多线程的基础,以及一些常用方法。关于线程同步、ExecutorService框架我会放到后续的文章进行讲解。


进程与线程的区别

进程

进程简单的来说就是在内存中运行的应用程序,一个进程可以启动多个线程。
比如在windows中一个运行EXE文件就是一个进程。

线程

同一个线程中的进程共用相同的地址空间,同时共享进程所拥有的内存和其他资源。

Read more »

前言

java反射机制指的是在java运行过程中,对于任意的类都可以知道他的所有属性以及方法,对于任意一个对象都可以任意的调用他的属性和方法,这种动态获取对象信息和动态调用对象方法的功能称为java反射机制,但是反射使用不当会造成很高的成本。

简单实例


反射获取类名称

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package top.crosssoverjie.study;
public class Reflect {
public static void main(String[] args) {
Class<Reflect> c1 = Reflect.class;
System.out.println(c1.getName());

Reflect r1 = new Reflect() ;
Class<Reflect> c2 = (Class<Reflect>) r1.getClass() ;
System.out.println(c2.getName());

try {
Class<Reflect> c3 = (Class<Reflect>) Class.forName("top.crosssoverjie.study.Reflect");
System.out.println(c3.getName());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
Read more »