公司用play2.26架构微服务,底层实现权限登陆控制各接口验参功能
其中拦截器是用继承下面这个类来实现的
public abstract class Action<T> extends Results
{
public T configuration;
public Action<?> delegate;
public abstract F.Promise<SimpleResult> call(Http.Context paramContext)
throws Throwable;
public static abstract class Simple extends Action<Void>
{
}
}
@With(CheckAction.class)
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Check {
String token() default "token";
/**
* 需要检查的接口参数名
* @return
*/
String[] args() default {};
/**
* 该接口是否需要进行权限检查
* @return
*/
boolean authCheck() default false;
boolean transactional() default false;
}
public class CheckAction extends Action<Check> {
private static ThreadLocal<UserToken> tl = new ThreadLocal<UserToken>();
private static ThreadLocal<String> tl2 = new ThreadLocal<String>();
@Override
public Promise<SimpleResult> call(Context ctx) throws Throwable {
String tokenParam = configuration.token();
String token = null;
String[] args = configuration.args(); //注意这里的configuration就是并发点,这里导致拿注解上的参数有误
return this.delegate.call(ctx); //注意这里的delegate也是并发点,这导致直接请求错误,即a请求到这时有可能已经变成b请求的delegate,这样一回调导致数据直接返回给b请求了
解决方法,先调试发现这个类始终只有一个,即是单例模式
经过排查发现在这个全局类里
public class AppBootstrap extends GlobalSettings
@Override
public <A> A getControllerInstance(Class<A> clazz) throws Exception {
/*String name = clazz.getName();
Object o = map.get(name);
if(o==null){
o = clazz.newInstance();
map.put(name, o);
}
return (A) o;*/
//这个东西搞死人了,这里不能用单例,不然CheckAction 里的configuration和delegate 会出现并发
return (A)clazz.newInstance();
}
有上面这个方法 调试发现这里用map实现了个单例。。。。。
去掉单例模式即解决
相关推荐
任何并发测试都需要回答两个主要问题: 可以保持多少个同时连接? 获得新连接的速度有多快? 我们用于测试是因为它们允许我们在任意时间长度内保持套接字打开,并且它们是 HTTP 的一部分,我们喜欢并在我们的基础...
还压缩包里面包含了Python并发编程PDF文档与配套代码Code,适合当今深度学习GPU并发分布式计算,欢迎大家下载学习。
高并发下Nginx安全配置: 一、版本安全 http板块下添加: # 隐藏版本号 server_tokens off; 二、IP安全 白名单: allow 192.168.1.1; deny all; 黑名单: deny 192.168.1.1; allow all; 三、文件安全 http模块中的...
Multi-threaded programs play an increasingly important role in current multi-core environments. Exposing concurrency bugs and debugging such multi-threaded programs are quite challenging due to their ...
此示例说明如何创建WebSocket端点以及如何使用: 枚举器.fromFile 枚举器枚举器枚举器.generateM 枚举器交错Iteratee.foreach Iteratee.ignore 并发单播频道推送您可以在我的存储库找到一个简单的客户端进行测试。...
立即学习:https://edu.csdn.net/course/play/9827/208778?utm_source=blogtoedu java并发编程。 串行和并行的区别:串行实质上是一个进程有一个线程。...任务本身需要协作执行:比如生产者消费者问题
玩一些平行 各种语言(场景)的并发。要可设置并发度,代码一定要是简明可以要的样子。 我会地点地禁止可变变量的存在(除非没法子但这样我也会让它被限制起来)
您可能拥有自己的 android 应用商店。这些简单的类是免费的,可帮助您从 google play 获取所有... 如果想知道如何获取包名称,您可以在获取 apk 文件并发回包名称的 android sdk 工具中使用 aapt 文件! 我希望你喜欢它
Akka用于构建并发的、事件驱动的后端 React构建(几乎不可变的)UI 组件 scala-js在客户端和服务器之间创建共享资源 除此之外,该应用程序还使用了许多不错的 Play 功能,例如: 用于服务器和客户端之间双向通信的...
立即学习:https://edu.csdn.net/course/play/24458/296241?utm_source=blogtoedu 1.send和recv底层分析 1)不管是recv还是send都不是直接接收对方数据或者发送给对方数据,而是对自己的操作系统内存进行操作; 2...
您可以在自己的设备上轻松运行示例 - 构建此项目或从 Google Play 获取。 该项目是使用带有 Gradle 构建系统和 Android 4.4 (KitKat) 平台的 Android Studio 开发的。 除了一些使用较新 API 的示例外,这些示例...
java版商城源码Akka 演员和期货介绍 ...但是,让多个线程访问可变状态存在很多问题。 作为插图,看看从优秀书中借来的和类 从 sbt 交互式提示(假设您已经编译了应用程序),继续并运行此作业: > ru
立即学习:https://edu.csdn.net/course/play/24458/296240?utm_source=blogtoedu 粘包现象:服务器接收到客户端的命令后,进行执行得到结果后,再发送回给客户端,在这个过程中如果服务器返回的结果的字节数会大于...
1.简单版的问题所在 1)报头信息不一定只是包含着命令执行结果的字节数长度,在文件传输的时候也可能包含文件名等,这时候就需要用到字典来将文件的相关信息进行封装 2)struct模块中struct.pack(‘l’,数据长度),...
java8 看不到源码修剪—— “让游戏保持活力” Prune 是一个自动测试 Play Framework 性能的工具。 它会自动检查不同版本的 Play,针对这些版本编译...测试接收PUT多部分表单(文件上传)请求的操作,对其进行解析并发
smart_rtmpd说明 您可以通过Google翻译将文档从中文翻译成英文!!! smart_webrtc下载网址: ... you can play rtmps with vlc. 聪明的rtmpd下载网址: http://www.qiyicc.com/download/rtmpd.zip 支持协议: p
它的灵感来自与其他框架(例如Java的Play!)一起使用。 框架,Ruby on Rails和PHP的CodeIgniter。 它的设计目标很简单: 允许入门级和中级Java程序员使用它尽快启动并运行应用从几个例子中尽可能容易地学习超越...
它具有简单的用户界面和布局(即没有Bootstrap或等效版本),并且没有生产级功能,例如身份验证,授权,文档所有者和分配,错误处理,并发访问,部署等。只有一个单元测试- SvgFileDAOTest。 还缺少一套全面的准则...
立即学习:https://edu.csdn.net/course/play/24458/296233?utm_source=blogtoedu 1.什么是网络编程? 答:网络编程也叫做socket编程即套接字编程,基于遵循socket套接字的规定进行的编程 2.什么是socket? 答:...
立即学习:https://edu.csdn.net/course/play/9827/208787?utm_source=blogtoedu 线程的挂起跟恢复 什么是挂起线程? 线程的挂起操作实质上就是使线程进入“非可执行”状态下,这个状态下CPU不会分给线程时间片,...