添加Token验证,如何生成Token,计算方式如下,采用不可逆转的方式生成[MD5加密]:
服务器端存储Token,采用线程安全的Map
客户端在发送业务请求前,先去服务器端申请一个Token,然后发送请求时把token和业务类一起发送,这时会发送请求超时和权限验证,因为Token只有一次有效,废话不说,代码如下:
Token接口:
Token实现类:
服务器端权限判断:
客户端调用:
这里测试很简单,你可以设置一个Token,然后调用,可以得到正确的数据,如果没有设置Token则返回没有权限,如果等待一分钟调用,则返回服务超时[程序未加提示,自己编写].
这里的Token你可以试着调用两次试试,只有一次会成功.因为调用完一次后就已经失效了.
这个代码还未进行优化,只是按照自己的构想实现了一把,嘿嘿
服务器端存储Token,采用线程安全的Map
客户端在发送业务请求前,先去服务器端申请一个Token,然后发送请求时把token和业务类一起发送,这时会发送请求超时和权限验证,因为Token只有一次有效,废话不说,代码如下:
Token接口:
- public interface TokenGenerator {
- public String generatorToken(String userName);
- public boolean validateToken(String token);
- }
Token实现类:
- public class TokenGeneratorImpl implements TokenGenerator {
- Map<String, Date> tokenStore = new ConcurrentHashMap<String, Date>();
- /**
- * 客户端发送请求得到token.
- * @param userName
- * @return
- */
- public String generatorToken(String userName){
- Date time = new Date();
- try {
- byte[] b = (time + DigestUtils.md5Hex(userName)).getBytes("utf-8");
- String token = DigestUtils.md5Hex(b);
- tokenStore.put(token,time);//存储这个时间点的token
- return token;
- } catch (UnsupportedEncodingException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return userName;
- }
- /**
- * 服务器在接收到请求时验证token,并把刚才的Token设置为失效
- * @param token
- * @return
- */
- public boolean validateToken(String token){
- if(tokenStore.containsKey(token)){
- Date time= tokenStore.get(token);
- Date normal = new Date();
- if(normal.getTime() - time.getTime() > 100*1000){
- //日志进退时
- return false;
- }
- tokenStore.remove(token);
- }else{
- //日志,没有权限
- return false;
- }
- return true;
- }
服务器端权限判断:
- public String hello() {
- //Hessian的服务之间怎么交互,比如我这个服务要用到其他的服务
- if(tokenGenerator.validateToken(token)){
- return "hello " + "欢迎学习Hessian";
- }else{
- return "你没有权限访问!";
- }
- }
客户端调用:
- String token = tokenGenerator.generatorToken("ycl");
- Hello hello = (Hello) context.getBean("helloServiceClient");
- //Spring2.5和hessian3.1果然可以结合.
- hello.setToken(token);
- //添加Token参数
- System.out.println(hello.hello());
这里测试很简单,你可以设置一个Token,然后调用,可以得到正确的数据,如果没有设置Token则返回没有权限,如果等待一分钟调用,则返回服务超时[程序未加提示,自己编写].
这里的Token你可以试着调用两次试试,只有一次会成功.因为调用完一次后就已经失效了.
这个代码还未进行优化,只是按照自己的构想实现了一把,嘿嘿