简单服务接口访问时权限以及缓存HashMap实现
实现拦截器:
package com.zqc.share.framework.interceptor; import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView; import com.zqc.share.framework.security.RequestContextValidate; public class TokenValidateInterceptor implements HandlerInterceptor { @Resource(name="requestContextValidate")
RequestContextValidate requestContextValidate; @Override
public void afterCompletion(HttpServletRequest arg0,
HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
// TODO Auto-generated method stub } @Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
Object arg2, ModelAndView arg3) throws Exception { } @Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,
Object arg2) throws Exception {
// TODO Auto-generated method stub
String str = (String)httpServletRequest.getParameter("p");
if(requestContextValidate.validate(str))return true;
else
return false;
} }
Validate实现:
package com.zqc.share.framework.security; import javax.annotation.Resource; import org.springframework.stereotype.Service; import com.zqc.share.dao.service.ServiceDao;
import com.zqc.share.framework.cache.CacheManager;
import com.zqc.share.framework.model.ServiceAccountItemCache;
import com.zqc.share.model.service.ServiceAccountItem; @Service
public class RequestContextValidate { @Resource(name="serviceDao")
ServiceDao serviceDao; @Resource(name="cacheManager")
CacheManager cacheManager; public boolean validate(String str){
String[] strs = str.split("\\|");
String keystr = strs[0];
String token = strs[1];
ServiceAccountItemCache serviceAccountItemCache; serviceAccountItemCache = cacheManager.serviceAccountMap.get(keystr); if(serviceAccountItemCache == null){
ServiceAccountItem serviceAccountItem = serviceDao.getAccountItem(keystr);
if(serviceAccountItem == null)return false;
if(token.equals(serviceAccountItem.getToken())){
cacheManager.insert(keystr,serviceAccountItem);
System.out.println("第一次访问");
return true;
}
else
return false;
}
else {
cacheManager.update(keystr);
System.out.println("已经访问过");
return true;
} } }
其中CacheManager用于管理cache
package com.zqc.share.framework.cache; import java.util.Date;
import java.util.HashMap; import org.springframework.stereotype.Service; import com.zqc.share.framework.model.ServiceAccountItemCache;
import com.zqc.share.model.service.ServiceAccountItem; @Service
public class CacheManager { public HashMap<String,ServiceAccountItemCache> serviceAccountMap = new HashMap<String,ServiceAccountItemCache>(); public void insert(String keystr,ServiceAccountItem serviceAccountItem){
ServiceAccountItemCache serviceAccountItemCache = new ServiceAccountItemCache();
serviceAccountItemCache.setServiceAccountItem(serviceAccountItem);
serviceAccountItemCache.setCreatetime(new Date());
serviceAccountMap.put(keystr,serviceAccountItemCache);
} public void update(String keystr){
ServiceAccountItemCache serviceAccountItemCache = serviceAccountMap.get(keystr);
serviceAccountItemCache.setCreatetime(new Date());
} }
ServiceAccountItemCache用于缓存ServiceAccountItem,以下是model:
package com.zqc.share.framework.model;
import java.util.Date;
import com.zqc.share.model.service.ServiceAccountItem;
public class ServiceAccountItemCache {
private ServiceAccountItem serviceAccountItem;
private Date createtime;
private int lifetime;
public ServiceAccountItem getServiceAccountItem() {
return serviceAccountItem;
}
public void setServiceAccountItem(ServiceAccountItem serviceAccountItem) {
this.serviceAccountItem = serviceAccountItem;
}
public Date getCreatetime() {
return createtime;
}
public void setCreatetime(Date createtime) {
this.createtime = createtime;
}
public int getLifetime() {
return lifetime;
}
public void setLifetime(int lifetime) {
this.lifetime = lifetime;
}
}
package com.zqc.share.model.service;
public class ServiceAccountItem {
private int id;
private String keystr;
private String token;
public String getKeystr() {
return keystr;
}
public void setKeystr(String keystr) {
this.keystr = keystr;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
}
以下是加密解密工具类,根据情况自行决定加密位置:
package com.zqc.share.framework.security; import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom; import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec; public class AESManager { public static String password = "our project is share"; /**
* 加密
*
* @param content 需要加密的内容
* @param password 加密密码
* @return
*/
public static byte[] encrypt(String content, String password) {
try {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128, new SecureRandom(password.getBytes()));
SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
Cipher cipher = Cipher.getInstance("AES");// 创建密码器
byte[] byteContent = content.getBytes("utf-8");
cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化
byte[] result = cipher.doFinal(byteContent);
return result; // 加密
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
}
return null;
} /**解密
* @param content 待解密内容
* @param password 解密密钥
* @return
*/
public static byte[] decrypt(byte[] content, String password) {
try {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128, new SecureRandom(password.getBytes()));
SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
Cipher cipher = Cipher.getInstance("AES");// 创建密码器
cipher.init(Cipher.DECRYPT_MODE, key);// 初始化
byte[] result = cipher.doFinal(content);
return result; // 加密
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
}
return null;
} /**将二进制转换成16进制
* @param buf
* @return
*/
public static String parseByte2HexStr(byte buf[]) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < buf.length; i++) {
String hex = Integer.toHexString(buf[i] & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
sb.append(hex.toUpperCase());
}
return sb.toString();
} /**将16进制转换为二进制
* @param hexStr
* @return
*/
public static byte[] parseHexStr2Byte(String hexStr) {
if (hexStr.length() < 1)
return null;
byte[] result = new byte[hexStr.length()/2];
for (int i = 0;i< hexStr.length()/2; i++) {
int high = Integer.parseInt(hexStr.substring(i*2, i*2+1), 16);
int low = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16);
result[i] = (byte) (high * 16 + low);
}
return result;
} }
简单服务接口访问时权限以及缓存HashMap实现的更多相关文章
- 前端和后端采用接口访问时的调用验证机制(基于JWT的前后端验证)(思路探讨)
说明:基于前后端,尤其是使用Ajax请求的接口,现在市面上网页上调用的Ajax基本都是没有验证的,如果单独提取之后可以无线的刷数据. 继上一篇http://www.cnblogs.com/EasonJ ...
- 多模块分布式系统的简单服务访问 - OSGI原形(.NET)
多模块分布式系统的简单服务访问 - OSGI原形(.NET) 先描述一下本篇描述的适用场景(3台server, 各个模块分布在各个Server上,分布式模块互相依赖.交互的场景): 多个OSIG引擎交 ...
- spring cloud各个微服务之间如何相互调用(Feign、Feign带token访问服务接口)
1.首先先看什么是Feign. 这里引用“大漠知秋”的博文https://blog.csdn.net/wo18237095579/article/details/83343915 2.若其他服务的接口 ...
- 九、frp对外提供简单的文件访问服务
通过 static_file 插件可以对外提供一个简单的基于 HTTP 的文件访问服务.类似于http的文件索引! 服务端frps.ini配置[common]bind_addr = 0.0.0.0bi ...
- WCF服务接口多,客户端在引用时出错!报WCF The maximum nametable character count quota (16384) has been exceeded while reading XML data错误
WCF服务接口多,客户端在引用时出错!报WCF The maximum nametable character count quota (16384) has been exceeded while ...
- 解决在iOS8环境下,当用户关闭定位服务总开关时,无法将APP定位子选项加入定位权限列表的问题
关键点:- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizati ...
- 缓存服务,还未创建完缓存时, 需要更改图层名称、服务名称、数据源位置、mxd名称等
缓存服务,还未创建完缓存时, 需要更改图层名称.服务名称.数据源位置.mxd名称等.已经创建好的缓存还可以再用吗? 测试后可以, 注意:新服务相对旧服务,符号样式没有改变,切片方案没有变化. 测试步骤 ...
- 设置Windows服务的访问权限
作者:beyond 默认情况下,只有管理员组成员.LocalSystem和Power Users组成员帐户才有权启动.停止服务.为了让普通用户也可以控制该服务,我们可以手动设置其访问权限.可能有些初学 ...
- 一个简单的URL访问权限校验
前言 目前最流行的两大安全框架:SpringSecruity.Shiro 权限控制,无非就是:前端控件是否可见.是否允许请求/访问URL 本文分享一个简单的URL访问权限校验,支持/./*./**等情 ...
随机推荐
- mybatis入门
1.什么是MyBatis ? 亲爱的度娘是这样说的: MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation ...
- LoadRunner 实现监控Tomcat
LoadRunenr没有监控Tomcat的专用监控器,为了用lr达到监控tomcat的目的可以通过打开Tomcat自带的Status页面之后,利用lr的关联技术得到相关的数据,把数据输出到lr自定义的 ...
- GJM : Unity调用系统窗口选择本地文件
感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...
- 文章转载利用border、transparent实现微风
微风效果预览 微风源码 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> & ...
- 如何基于OM模型使用C#在程序中给SharePoint的BCS外部数据类型的字段赋值
概述: 外部内容类型和数据,SharePoint从2010这个版本开始就对BCS提供非常强大的支持,点点鼠标就可以取代以前直接编辑XML的方式来设置SharePoint到SQL数据库的连接.非常方便地 ...
- 用Kotlin开发Android应用(III):扩展函数和默认值
这是关于Kotlin的第三篇. 原文标题:Kotlin for Android (III): Extension functions and default values 原文链接:http://an ...
- Gui系统之View体系(2)---View的setContent
1.从SetContentView讲起 1.1Activty的setContentView里面的内容 public void setContentView(@LayoutRes int layoutR ...
- sp_executesql得到执行sql语句的返回值
执行 sql语句,得到 变量的值 ' declare @Partition int; ); ); SET @SQLString = N'SELECT @RangeKeyOUT = $PARTITION ...
- INITIAL参数设置导致TRUNCATE TABLE不能降低高水位线案例
在一个数据库使用下面SQL找出了一批需要降低高水位线的表,其中有几个表没有数据,于是我打算用TRUNCATE来降低高水位线HWM SELECT a.owner, a.segment_na ...
- ORACLE回收站机制介绍
回收站概念 从ORACLE 10g开始,引入了一个叫回收站(Recycle Bin)的概念.它的全称叫Tablespace Recycle Bin.回收站实际是一个逻辑容器(逻辑区域),原理有点类似于 ...