06627网页制作与网站建设,代做网站多少钱,枣阳网站建设,做企业网站时需要注意哪些地方在前后端分离的项目中#xff0c;通过session和cookie的通信一般就失去效益了#xff0c;即使这么做了也会产生著名的漏洞问题CSRF#xff08;Cross-site request forgery#xff09;#xff0c; 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。因… 在前后端分离的项目中通过session和cookie的通信一般就失去效益了即使这么做了也会产生著名的漏洞问题CSRFCross-site request forgery 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。因为cookie依赖于sessionid我们可以在浏览器中f12看到具体情形恶意攻击者就可以伪造这个id进行跨域请求会产生非常严重的后果。 所以目前后端分离的项目如果传递信息一般有两种思路一种是在后端开启共享存储的内存前端后端都可以存数据进去常见的方式是线程间通信的一种实现即Threadlocal但这种方式虽然优雅仍然避免不了内存泄漏的问题简单来讲hashmap的key没了但是value在导致这块内存无法被回收。第二种是使用token之前几乎所有的前后端项目都采用了这种交互方式后端生产token前端缓存token同一个用户每次请求都是拿着同一个token去后端验证但是token有一个很大的问题那就是签名问题很难标注token的具体信息项目如果后端分布式token的验证问题也十分繁琐。所以引入jwt做中介。Jwt解决了身份校验的问题但后端如果分布式jwt的验证总是要请求认证服务也是非常繁琐的为了解决这个问题引入了RSA非对称加密的思路只有认证服务有私钥其余的服务都是公钥公钥加密私钥解密其余服务不需要验证内容是否正确只需要使用公钥验证格式是否符合RSA的规范。 Jwt这样看来是一个非常好的信息传递包裹但是知道了共享内存不够优秀只有另一种方式来进行前后端通信了那就是第三方数据库。 我们常说的缓存redis就可以作为很好的工具。 但是redis并不能存储对象redis已经应用相当广泛了但redis本身并没有直接存储对象的方法我们可以通过转换对象的方式来存储对象。 如果redis存储对象需要序列化方案一序列化对象为二进制 使用redis接口 jedis.get(byte[] key)
jedis.set(byte[] key, byte[] value)
至于序列化方式我们有很多种选择比如Java serialize,Protobuf,或者自己手动序列化都行 public byte[] serialize(Object obj);public Object unSerialize(byte[] bytes); 方案二序列化为字符串 使用redis接口 jedis.get(String key); jedis.set(String key, String value); 序列化为字符串我们也有很多选择Json(Jackson,FastJson),Xml等方式方案三转换对象为map 使用redis接口 jedis.hgetAll(String key); jedis.hmset(String key, MapString,String values); 知道了只有序列化后才能使用redis存储对象实际生产中可以使用第三方工具进行序列化比如fastjsonjackson等。 本例中使用fastjson封装成生产中的redis工具 Configuration
ConditionalOnClass(RedisOperations.class)
EnableConfigurationProperties(RedisProperties.class)
public class RedisConfig {
Bean(redisTemplate)
public RedisTemplateObject, Object redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplateObject, Object template new RedisTemplate();
//使用fastjson序列化
FastJsonRedisSerializer fastJsonRedisSerializer new FastJsonRedisSerializer(Object.class);
// value值的序列化采用fastJsonRedisSerializer
template.setValueSerializer(fastJsonRedisSerializer);
template.setHashValueSerializer(fastJsonRedisSerializer);
// key的序列化采用StringRedisSerializer
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
template.setConnectionFactory(redisConnectionFactory);
return template;
}
Bean
ConditionalOnMissingBean(StringRedisTemplate.class)
public StringRedisTemplate stringRedisTemplate(
RedisConnectionFactory redisConnectionFactory) {
StringRedisTemplate template new StringRedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
} 当我们在项目中进行应用时只需要Autowired就可以了非常方便。 当然如果用redis工具取对象还需要反序列化fastjson举例即JSON.pareObject(rts.opsForValue().get(key).toString(),xxx.class).