公司用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实现了个单例。。。。。
去掉单例模式即解决
相关推荐
2. **异步编程**:Play Framework基于Akka框架,支持非阻塞I/O和异步处理,提高了Web应用的并发性能。 3. **路由系统**:Play Framework的路由文件定义了URL到Action的映射,允许开发者灵活地控制请求处理逻辑。 4...
1. **无服务器状态**:Play遵循无状态原则,所有的数据都存储在客户端或者数据库中,这使得服务器可以轻松地处理高并发请求。 2. **即时重启**:当你修改代码后,Play会自动编译并重新加载改动,无需手动重启服务器...
4. **异步I/O**:Play 使用Akka框架实现非阻塞I/O,可以处理大量的并发请求,适合构建高并发的Web应用。 5. **RESTful API支持**:Play 鼓励开发者使用HTTP协议的特性来构建应用程序,便于构建服务化和微服务化的...
- **异步I/O**:Play基于Akka框架,采用非阻塞I/O,能够处理大量并发请求,适合构建高性能的Web应用。 - **热重载**:在开发过程中,Play支持代码热重载,修改后无需重启服务器即可看到效果,极大地提高了开发效率...
12. **社区与生态系统**:Play拥有活跃的社区,提供了丰富的插件和文档,以及大量的示例应用,有助于开发者解决问题和学习新技能。 通过阅读《Play Framework最新教程.pdf》和《Play框架教程.pdf》,你将深入理解...
4. **异步I/O**:Play利用Akka框架的反应式编程模型,实现了非阻塞I/O,提高了并发处理能力。 5. **模板引擎**:Play内置了模板引擎,允许开发者使用简单的语法编写HTML,同时支持嵌入Java或Scala代码,实现动态...
- **企业级应用开发**:由于 Play Framework 提供了强大的并发处理能力和灵活的架构支持,非常适合用于构建大型的企业级应用。 - **社交平台建设**:利用 Play Framework 的 WebSocket 支持功能,可以轻松实现消息推...
2. **异步编程模型:** 与传统的Web框架不同,Play 使用非阻塞I/O模型,这使得应用程序在处理高并发请求时性能更优,降低了服务器资源的消耗。 3. **热部署:** Play 提供了热部署功能,这意味着你可以在开发过程中...
- **异步处理**:异步处理是Play框架的一大特点,它通过非阻塞的方式处理网络请求,有效避免了线程阻塞问题,显著提升了系统的并发能力。 通过上述内容可以看出,《Play for Java》这本书全面覆盖了使用Play框架...
8. **Akka集成**:尽管Play 1.1版本较早,但它已经集成了Akka actor模型,这为处理并发和异步操作提供了强大的支持,增强了应用的性能和可扩展性。 9. **全球化与本地化**:Play框架提供了内置的i18n支持,方便...
10. **异步编程**:Play支持异步Jobs、预定义任务和HTTP下的异步编程,如使用Continuations、Callbacks和HTTP响应流,以及WebSockets,提高了系统的并发能力。 11. **测试**:Play提供了丰富的测试工具,包括单元...
7. **异步编程**:Play Framework 基于Akka Actor模型,支持非阻塞I/O和异步处理,这使得它可以高效地处理高并发请求。 8. **测试**:Play Framework 提供了集成测试工具,如`play-test`模块,便于编写单元测试和...
2. **异步编程模型**: Play使用Akka Actor系统进行异步处理,这意味着它可以处理大量并发请求,提高应用程序的性能。这种非阻塞I/O方式使得Play特别适合构建高并发的Web应用。 3. ** MVC 架构**:Play遵循MVC设计...
- **Akka集成**:Play框架基于Akka,提供了强大的异步处理能力,可以处理高并发场景。 - **Action**:Action是处理HTTP请求的核心组件,你可以定义自定义的Action来处理特定的HTTP请求。 - **测试支持**:Play提供了...
5. **崩溃报告**:Google Play服务还包括Crashlytics,用于收集和分析应用崩溃日志,协助开发者定位和修复问题。 6. **云消息推送**:Firebase Cloud Messaging (FCM) 是Google提供的推送通知服务,允许开发者向...
10. **社区支持**:虽然版本较旧,但Play框架拥有活跃的社区,开发者可以在官方论坛和Stack Overflow上找到大量的问题解答和解决方案。 综上所述,Play框架1.2.7为Java开发者提供了一套高效、灵活的Web开发环境,...
- **非阻塞 I/O**:Play Framework 基于 Akka 框架实现了非阻塞 I/O,这使得在处理大量并发请求时无需担心性能瓶颈问题。本书会详细介绍如何利用这一特性构建高并发的应用程序。 - **模块化架构**:该框架支持模块化...
在Play框架中,开发者可以利用其非阻塞I/O和对RESTful架构的完美支持,创建响应迅速、高并发的应用程序。 #### Play框架的特点 - **无状态架构**:简化了Web应用的开发,易于扩展。 - **可伸缩性**:支持基于actor...
7. **异步I/O**:Play基于Akka框架,利用非阻塞I/O模型,可以处理大量并发请求,提高了Web应用的性能。 8. **测试支持**:Play框架内建了测试工具,可以方便地进行单元测试和集成测试,如模拟HTTP请求,测试控制器...
2. **异步编程模型**:Play Framework 使用非阻塞I/O和事件驱动模型,使得它在处理高并发请求时表现优秀,特别适合构建实时Web应用。 3. **路由系统**:Play 的路由文件定义了URL到控制器方法的映射,提供了声明式...