java String Map List 转换
String completeByParam = dispatchFeign.getCompleteByParam("用车", startTime, endTime, page, limit);
System.out.println("completeByParam = " + completeByParam);
Map json = JSONObject.parseObject(completeByParam, Map.class);
System.out.println("json = " + json);
String data = json.get("data").toString();
System.out.println("data = " + data);
Map map = JSONObject.parseObject(data, Map.class);
System.out.println("map = " + map);
String list = map.get("list").toString();
System.out.println("list = " + list);
List<Map<String, Object>> list1 = Lists.newArrayList();
if (StringUtils.isNotEmpty(list)) {
list1 = JSONArray.parseObject(list, List.class);
}
System.out.println("list1 = " + list1);
for (Map<String, Object> l : list1) {
System.out.println("l = " + l);
}
如何防止xss攻击
XSS攻击通常指的是利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页的程序。
这些恶意网页程序通常是JavaScript,但实际上也可以包括Java、 VBScript、ActiveX、 Flash 或者甚至是普通的HTML。
攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。
如何防范XSS:
1. 自己写 filter 拦截来实现。这个filter不但可以拦截xss攻击,也可以拦截sql注入攻击。
但要注意的时,在WEB.XML 中配置 filter 的时候,最好将这个 filter 放在第一位。
我们知道filter谁的写在上面,谁先被过滤。
比如我们有一个是否登录的过滤器如果放在上面,结果因为有漏洞,通过sql注入可以实现免登陆,
而黑客利用,导致了直接登录就麻烦了。所以要先过滤一些特殊字符,再放行去做其他业务。
这个过滤器里面可以匹配一些sql注入的关键字和一些xss攻击的关键字,xss攻击的关键字包括:
script,alert,img,src、eval 、javascript等关键字,
拦截到后处理方法也有很多。
a、可以全部替换成空字符串,简单粗暴,但是可能造成错误显示。
b、可以转换成全角字符
c、可以使用html实体编码,url编码等 "<" "<"
这要根据具体实际的情况来判断该怎么使用了。
filter过滤器使用相对麻烦,要建立一套完备的匹配库,否则有可能xss漏洞过滤不到,或则过滤的太多影响程序功能。但是filter可以根据自己程序实际情况随心定制。
2、ESAPI框架实现。 ESAPI是一套API级别的web应用解决方案。简单的说,ESAPI就是为了编写出更加安全的代码而设计出来的一些API,方便使用者调用,从而方便的编写安全的代码。
a、引入Jar
org.owasp.esapi esapi 2.1.0.1
b、加入配置文件
在工程的资源文件目录下增加配置文件ESAPI.properties及validation.properties,文件内容可为空。如果为空则都取默认值。也可以手动配置。
c、校验参数使用
ESAPI提供了很多常见的校验,可以方便针对不同的需要做校验。
ESAPI提供了很多常见的校验,可以方便针对不同的需要做校验 if(!ESAPI.validator().isValidInput("",input,"Email",11,false)){ System.out.println("出错了"); }
这种方式:结构清晰,易于扩展。如果想省事,可以使用默认配置,也可以自己定制。
ESAPI参考:https://blog.csdn.net/frog4/article/details/81876462
3、spring实现。
首先添加一个jar包:commons-lang-2.5.jar ,然后在后台调用这些函数
StringEscapeUtils.escapeHtml(string);
//转移html脚本StringEscapeUtils.escapeJavaScript(string);
//转移JavaScript脚本StringEscapeUtils.escapeSql(string);
//转移sql脚本
或则结合springMVC的InitBinder使用
@InitBinder只在@Controller中注解方法来为这个控制器注册一个绑定器初始化方法,方法只对本控制器有效。
/** * 防止XSS攻击 */
binder.registerCustomEditor(String.class, new StringEscapeEditor());
//告诉spring String 类型的参数StringEscapeEditor来管了,它来处理
使用简单方便,但是不能定制过滤方式。
参考地址:https://www.toutiao.com/i6792402396845703693/
spring ioc aop 反射 动态代理之间的原理和关系
1、类加载器加载class文件
2、加载到jvm 中,obtainFreshBeanFactory()里的refreshBeanFactory()来为每个bean生成 一个BeanDefinition ,
注意此时不是我们想要的对象,只是bean的信息,依赖关系等,后续后面spring解析器去解析一个BeanDefinition。
3、BeanDefinition信息注册,
将抽象好的BeanDefinition统一注册到IoC容器中,IoC容器是通过hashMap来维护BeanDefinition信息的,key为beanName,value为BeanDefinition。
4、createBeanInstance()根据beanDefinition的信息创建bean的实例
怎么创建呢?主要有两种方法,一种是通过beanUtil反射,另一种 CGLIB来实例化对象,如果Bean定义中有方法覆盖,则就需要CGLIB父
。。。
7、至于aop特性是实例化好了之后,后置处理来处理
如果我们spring配置了AOP的话,这个时候就要考虑是cglib还是jdk 动态代理去实现这个功能
1、在默认情况下,如果spring bean有接口就使用jdk的动态代理。Proxy.newProxyInstance。如果没有接口就调用cglib通过操作字节码去生成目标类的子类来完成代理。
2、可以手动配置,强制都使用cglib,如果xml中配置 proxy-target-class=true 或则在注解上配置
@EnableAspectJAutoProxy(proxyTargetClass=true) 这个时候就全部使用cglib来完成动态代理
记得aop特性是初始化的时候完成的
4、如果需要类,spring 可以通过注解 或则代码去 map中 获取bean 。
Java 0和1代表的含义
在Java中:
1、整数型的0和1: 代表数字0和1
2、boolean类型的0和1:
0代表:false(也就是说整数型的0转为布尔类型时输出false)
1代表:true(整数1转换为布尔类型输出true)
其实在整数转布尔类型时:0为false,非0为true,当然1也是true;
3、在二进制最高位:
0代表:正数
1代表:负数