我想在现有的Java Web应用程序中实现双提交预防(实际上是struts).在架构方面,我们讨论的是2到N个可能的应用服务器(tomcat)和一个单一的数据库服务器(mysql).各个服务器彼此不了解,也无法交换消息.在应用程序服务器前面有一个负载均衡器,可以进行粘性会话.
所以基本上有两种双提交预防客户端和服务器端.如果可能的话,我想进入服务器端,因为如果人们在浏览器中禁用cookie和/或javascript,所有客户端技术似乎都会失败.
这让我想到通过数据库锁进行某种类似互斥的同步.我认为可以计算用户输入数据的校验和并将其持久保存到专用数据库表.在每次提交时,应用程序必须检查是否存在相等的校验和,这表明给定的提交是重复的.当然,必须定期清除此表中的校验和.问题是检查数据库中是否存在重复校验和的整个过程,如果没有校验和,则插入校验和几乎是一个关键部分.因此,必须事先锁定校验和表,并在该部分之后再次解锁.
当我想到桌子锁时,我的僵局和瓶颈警铃开始响起.所以我的问题是:是否有更好的方法来防止无状态Web应用程序中的双重提交?
请注意,struts TokenInterceptor
不能在这里应用,因为当禁用cookie时它会失败(它依赖于HTTP会话,如果没有会话cookie,它就不存在).
java struts web-applications stateless double-submit-prevention
我想知道无状态编程的好处,并找到了一个分享我的问题的人: 无状态编程的优点?
当我读完答案时,它让我对这个相反的问题感到好奇.有状态编程有哪些优点?似乎最近有很多关注无状态代码,但我对趋势很谨慎.
似乎有状态(即命令式)编程可能比无状态(即功能)编程更适合某些场景,并且我希望能够更好地识别哪些问题可以通过有状态编程来解决.
procedural-programming functional-programming stateful mutable stateless
我正在构建一个Wicket Web应用程序,它将不得不处理大量的同时请求.我已经设置了一个测试环境和一些jmeter脚本来进行负载测试,我注意到如果我使大多数页面无状态,我可以减少应用程序的CPU和内存占用.
我已经在最大页面的onBeforeRender()方法中添加了代码,以向我展示哪些组件导致我的页面有状态.这是我检测到的代码:
@Override
protected void onBeforeRender() {
if (!getSession().isTemporary()) {
visitChildren(Component.class, new IVisitor<Component>() {
@Override
public Object component(Component component) {
String pageClassName = AbstractStatelessBasePage.this.getClass().getName();
if (!component.isStateless()) {
String msg = pageClassName+" is stateful because of stateful component " + component.getClass().getName() + " with id " + component.getId() + ".";
List<IBehavior> behaviourList = component.getBehaviors();
for (IBehavior iBehavior : behaviourList) {
if (!iBehavior.getStatelessHint(component)) {
msg += "\n\t" + "The component has stateful behaviour: " + iBehavior.getClass().getName();
}
}
LOG.error(msg);
}
checkedPages.add(pageClassName); …
Run Code Online (Sandbox Code Playgroud) 几天前有人问我这个问题我没有答案:
因为HTTP是无状态协议.当我们打开www.google.com时,它可以被称为REST呼叫吗?
我的想法:
当我们在google.com上进行搜索时,所有信息都会通过Cookie和网址参数传递.它看起来像一个无国籍的请求.但搜索结果并不独立于用户的过去请求.搜索结果特定于用户兴趣和行为.现在,它看起来不像无状态请求.
我知道这是一个老问题,我已经阅读了许多SO答案,例如为什么HTTP是无状态协议?但我仍然无法理解在谷歌或亚马逊(基于过去购买的推荐)或任何其他基于用户活动的推荐网站上跟踪用户活动时会发生什么.
它是RESTful还是RESTless?
如果我想创建一个Web应用程序,我在其中使用REST架构并仍提供特定于用户的响应,该怎么办?
我正在开发一个REST API,供开发人员编写移动应用程序使用.用户将能够使用第三方服务(Google,Twitter等)进行身份验证,这主要由OAuth处理(取决于相关服务).我们在客户端应用程序和API服务器之间使用2脚OAuth(消费者密钥/密钥是特定于应用程序的,开发人员在应用程序注册时从我们的站点获取它).
我的问题是如何处理以无状态方式跟踪用户身份验证.我没有用户凭据来发送每个请求.我可以在用户登录时创建一个唯一的session_id,然后在每个REST API请求中都要求它.我的问题还有其他解决方案吗?使用唯一的session_id来识别用户是否会导致无状态REST API透视图出现任何问题?
我已阅读此帖,但它没有回答我的问题. 带有实例变量的无状态会话bean 我正在阅读JEE5教程,在这个页面上它说明 http://download.oracle.com/javaee/5/tutorial/doc/bnbly.html "然而,客户端可能会改变实例的状态池化无状态bean中的变量,并且该状态将保留到池化无状态bean的下一次调用中 "
我不同意这一点.因为我认为在不同的bean实例的调用中保持"任何"状态是你需要'有状态'的会话bean.
请提前帮助我理解这个问题
假设我有一个T级
C++静态初始化惨败可以破坏我的程序吗?我不这么认为,因为即使其中一个静态实例在使用之前没有初始化,这也不重要,因为T对象是无状态的.
我有兴趣为类似枚举的类这样做:
// Switch.h
class Switch {
public:
static Switch const ON;
static Switch const OFF;
bool operator== (Switch const &s) const;
bool operator!= (Switch const &s) const;
private:
Switch () {}
Switch (Switch const &); // no implementation
Switch & operator= (Switch const &); // no implementation
};
Run Code Online (Sandbox Code Playgroud)
// Switch.cpp
Switch const Switch::ON;
Switch const Switch::OFF;
bool Switch::operator== (Switch const &s) const {
return this == &s;
}
bool Switch::operator!= (Switch const &s) const …
Run Code Online (Sandbox Code Playgroud) 我想基于spring-boot,spring-security和spring-oauth2设置一个简单的OAuth2提供程序.
我在一台实例计算机上运行了一切:对于OAuth2授权,用户被发送到/oauth/authorize
.大多数用户都没有登录,所以他们被/login
弹簧安全重定向到然后返回/oauth/authorize
以完成授权.
在默认配置中,spring-security使用session-id在用户的浏览器中设置cookie,并将会话数据存储在内存中.
public static class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.and()
.formLogin()
.loginPage("/login")
.permitAll();
}
[...]
Run Code Online (Sandbox Code Playgroud)
为了在不丢失用户会话的情况下启用负载平衡和蓝绿色部署,(我认为)我必须执行以下步骤:
/login
在其他位置
这种方法有意义吗?需要做哪些改变?
我正在努力解决如何使用多因素身份验证设计无状态RESTful身份验证API的概念.
几乎按照定义,2FA的需要需要多个状态; 使用用户名/密码登录,然后提交"代码"(TOTP,SMS代码,验证问题的答案等).这进一步意味着某种有限状态机(FSM).
据我所知,为维持无状态机制而存在的唯一选择是:
显然,传输所有数据是荒谬的.因此,这意味着在请求中传输状态信息(不透明或其他)或在服务器上维护状态.
还是有其他一些我缺少的技术?
我正在阅读《有效的Java》,遇到了约书亚·布洛赫(Joshua Bloch)建议类似的情况
class MyComparator extends Comparator<String>{
private MyComparator(){}
private static final MyComparator INSTANCE = new MyComparator();
public int compare(String s1,String s2){
// Omitted
}
}
Run Code Online (Sandbox Code Playgroud)
XYZComparator是无状态的,没有字段。因此,该类的所有实例在功能上都是等效的。因此,节省不必要的对象创建应该是一个单例。
因此,如果它没有字段,那么为它指向的任何类创建一个静态的final 总是安全的吗?从两个线程并行调用时,这不会引起多线程问题吗?或者我误解了一些基本知识。如果没有共享字段,就像每个线程都有执行的自主权吗?Object
compare