发表于: 2018-09-17 15:33:36
1 452
今天是查了一堆的这个报错,最后还是将路径改为一样了才可以使用;晚上看了好多,都说是路径的问题,顺带把security manager的知识也看了下,就差去设置这个和关闭这个了;。。然后看了好多,都说是文件的classpath改下就行,要么一模一样,要么改动classpath,设置security manager的配置文件policy文件。。。原因就是找不到加载的对象;
再查一遍包名是不是完全一模一样。。。就是这个位置的名称;之前好像是多了一层名字,改了以后就好用,tmd。。。
package com.jnshuboot.pojo;
不过还是学到了一个security manager类的知识。。还有就是加载路径的问题。。。
java的security manager知识;
SecurityManager在Java中被用来检查应用程序是否能访问一些有限的资源,例如文件、套接字(socket)等等。它可以用在那些具有高安全性要求的应用程序中。通过打开这个功能, 我们的系统资源可以只允许进行安全的操作。
当Java虚拟机启动时,它首先通过检查系统属性java.security.manager来确定SecurityManager是否打开了。如果打开了,那么SecurityManager实例将被创建,它可以被用来检查不同的权限。默认情况下,SecurityManager是关闭的,但是这里有一些方法可以打开SecurityManager。
1.当我们运行一个程序,我们可以指定JVM命令 -Djava.security.manager 使SecurityManager运行。
java -Djava.security.manager <class_name>
这是打开SecurityManager最常见的方式。java.security.manager是一个系统属性,您可以使用System.getProperty(“java.security.manager”)检查该系统属性是否被设置。
在这里,你可能会认为,我们可以使用System.setProperty(“java.security.manager”)打开SecurityManager,但是并不能这么设置。因为先前我们提到,这个系统属性是在当JVM启动时进行检查的。如果我们用程序手动设置该属性,并不能奏效,因为JVM已经启动了,已经过了检查系统属性的步骤了。
2.通过程序打开SecurityManager
现在,如果我们真的想通过我们的程序打开SecurityManager,我们也能做到。 System类中有一个叫 setSecurityManager() 的方法可以做到这一点。这个方法的参数是一个SecurityManager实例。
允许某些操作的权限
针对开篇遇到的异常,可以通过添加文件plugin-security.policy并在调用命令行里面指定policy文件路径-Djava.security.policy=file:///pathto/plugin-security.policy来授权操作权限
这个路径问题问了下师兄,说是java序列化的问题,想想也是;要是包名不一样了,那这类是不一样的;
java序列化后的类,全限定类名,方法,属性完全一样才算一样,像之前我的,就是全限定类名不一样,反序列化的时候,系统认为不是一个类,这个样子。。
成功后,发现一个问题,不知道怎么解决了。。。就是传入参数的问题,我这边不管传入什么参数,查询的结果都是进行rmi第一次调用的结果;
例如:我第一次调用的是查询studyId=java-002的数据;后面不管我怎么改studyId的值,查出来的都是java-002的值;不管我客户端怎么改,服务端和客户端都是之前的参数;
解决的办法是重启服务端,这倒是可以实现,但是我不能每次查询都重启下服务器的rmi服务端吧。。
详细看了自己的代码,基本判断就是方法的问题;那是不是studentService的方法有问题,用studentMapper的方法试了,结果是没有问题的。。。看下stuentService的代码,恍然大悟,是之前的mybatis的generator的studentExample的问题,条件残留。。。。真狗了我自己。。
@Override
public List<Student> getUser(String studyId) {
Student student=new Student();
student.setStudyId(studyId);
List<Student> list=studentService.selectByStudyId(student);
System.out.println(list);
return list;
}
正好,将之前写的studntService的代码也完善下。。。加上studentExample.clear();都。。。
studentExample.clear();
public List<Student> selectByStudyId(Student student){
//根据学生studyId查询学生数据,studyId不为空List<Student> studentList=new ArrayList<>();
studentExample.clear();
StudentExample.Criteria criteria=studentExample.createCriteria();
if(student.getStudyId()!=null) {
criteria.andStudyIdEqualTo(student.getStudyId());
studentList=studentMapper.selectByExample(studentExample);
return studentList;
}
return studentList;
}
还有一个,我们调用rmi客户端接口的方式,正常我们从rmi调用接口的时候,是调用的RmiProxyFactoryBean这个类来得到接口的的实现类,进行具体的操作;
但是之前参看的例子直接使用了CommandLineRunner,没有使用RmiProxyFactoryBean,也是可以使用的,缺点就是程序初始化的时候,会自动运行一次CommandLineRunner,看了下这个类,感觉还是不用的好,可以后面用来做点其他的事情;关于这个类的知识;
CommandLineRunner及相关知识
spring boot应用中,我们可以在程序启动之前执行任何任务。为了达到这个目的,我们需要使用CommandLineRunner或ApplicationRunner接口创建bean,spring boot会自动监测到它们。这两个接口都有一个run()方法,在实现接口时需要覆盖该方法,并使用@Component注解使其成为bean。CommandLineRunner和ApplicationRunner的作用是相同的。不同之处在于CommandLineRunner接口的run()方法接收String数组作为参数,而ApplicationRunner接口的run()方法接收ApplicationArguments对象作为参数。当程序启动时,我们传给main()方法的参数可以被实现CommandLineRunner和ApplicationRunner接口的类的run()方法访问。我们可以创建多个实现CommandLineRunner和ApplicationRunner接口的类。为了使他们按一定顺序执行,可以使用@Order注解或实现Ordered接口。
CommandLineRunner和ApplicationRunner接口的run()方法在SpringApplication完成启动时执行。启动完成之后,应用开始运行。CommandLineRunner和ApplicationRunner的作用是在程序开始运行前执行任务或记录信息。
想在重构的时候,加上最简单的后台角色管理和用户管理的功能,具体设计如下。。。
权限表:--可以增加或删除权限,在后台大动的情况下才涉及。。
权限表的权限固定,一般不涉及权限的增加和删除--因为权限增加对应的controller得增加,也就是系统有新的权限需要更改才需要更改;
目前权限表中,1为admin权限;2为user权限;
用户表中:我看网上还有设计的时候,加入了手机号和邮箱字段;我这边就不加多余的字段了。。如果前端的登陆验证逻辑使用security的话,需要加上这几个字段--ps,看到有个大佬做的自己的项目,前端用security,后端用shiro;
角色管理:涉及两个表;角色表和角色权限表;
角色表:添加一个角色;包括角色id和角色名称;添加必要描述
角色权限表:添加角色的id;添加权限的id,添加权限的描述;
用户管理:涉及两个表;用户表和用户角色表;
用户表:添加一个用户包括的字段:用户id,用户名称,用户密码,用户描述;
用户角色表:添加用户角色关联包括的字段:表id,用户id,角色id,用户名称,角色名称;
明天计划:继续整理自己的代码;
评论