我对Spring和Spring安全性比较陌生.
我试图编写一个程序,我需要使用Spring安全性在服务器端验证用户,
我想出了以下内容:
public class CustomAuthenticationProvider extends AbstractUserDetailsAuthenticationProvider{
@Override
protected void additionalAuthenticationChecks(UserDetails userDetails, UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken)
throws AuthenticationException
{
System.out.println("Method invoked : additionalAuthenticationChecks isAuthenticated ? :"+usernamePasswordAuthenticationToken.isAuthenticated());
}
@Override
protected UserDetails retrieveUser(String username,UsernamePasswordAuthenticationToken authentication) throws AuthenticationException
{
System.out.println("Method invoked : retrieveUser");
//so far so good, i can authenticate user here, and throw exception if not authenticated!!
//THIS IS WHERE I WANT TO ACCESS SESSION OBJECT
}
}
Run Code Online (Sandbox Code Playgroud)
我的用例是,当用户通过身份验证时,我需要放置一个属性,如:
session.setAttribute("userObject", myUserObject);
Run Code Online (Sandbox Code Playgroud)
myUserObject是某个类的对象,我可以跨多个用户请求访问整个服务器代码.
我正在使用Spring Security 3.0对LDAP服务器进行身份验证,我无法设法自己设置会话超时时间.我相信默认值是30分钟,但我需要将其设置为更长
我有一个从外部代码获取JPA实体的服务.在这个服务中,我想迭代一个延迟加载的集合,该集合是该实体的一个属性,以查看客户端是否相对于DB中的当前版本添加了一些内容.
但是,客户端可能从未触及过该集合,因此它仍未初始化.这导致众所周知
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.example.SomeEntity.
当然,如果客户从未触及过该集合,我的服务无需检查它是否有可能发生变化.问题是我似乎无法找到一种方法来测试集合是否已初始化.我想我可以打电话size()给它,如果它抛出LazyInitializationException我会知道,但我试图不依赖于这样的模式.
isInitialized()某处有某种方法吗?
众所周知,AWS lambda 可能会重用早期创建的处理程序对象,而且确实如此(请参阅常见问题解答):
问:AWS Lambda会重用函数实例吗?
为了提高性能,AWS Lambda可以选择保留您的函数实例并重复使用它来提供后续请求,而不是创建新副本.您的代码不应该假设这总是会发生.
问题是关于Java并发性.如果我有一个处理程序的类,请说:
public class MyHandler {
private Foo foo;
public void handler(Map<String,String> request, Context context) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
那么,foo在这里访问和使用对象变量是否可以线程安全?
换句话说:AWS lambda可以同时为不同的调用使用相同的对象吗?
编辑我的函数在基于事件的源上处理,特别是它由API网关方法调用.
EDIT-2当你想要将某种连接池实现到外部资源时,这类问题就会出现,所以我想保持与外部资源的连接作为对象变量.它实际上按预期工作,但我害怕并发问题.
EDIT-3更具体地说,我想知道:AWS lambda处理程序的实例是否可以共享公共堆(内存)?我必须指定这个额外的细节,以防止回答列出有关java线程安全对象的明显和常见的事情.
java concurrency multithreading amazon-web-services aws-lambda
要将Hamcrest与JUnit 4一起使用,我们使用一个assertThat()函数.但是,JUnit 5不再具有assertThat()功能.如何在没有Hamcrest的情况下使用assertThat()?
我有一个用于存储对象的HashMap:
private Map<T, U> fields = Collections.synchronizedMap(new HashMap<T, U>());
Run Code Online (Sandbox Code Playgroud)
但是,当试图检查密钥的存在时,containsKey方法返回false.
equals和hashCode方法已实现,但找不到密钥.
调试一段代码时:
return fields.containsKey(bean) && fields.get(bean).isChecked();
Run Code Online (Sandbox Code Playgroud)
我有:
bean.hashCode() = 1979946475
fields.keySet().iterator().next().hashCode() = 1979946475
bean.equals(fields.keySet().iterator().next())= true
fields.keySet().iterator().next().equals(bean) = true
Run Code Online (Sandbox Code Playgroud)
但
fields.containsKey(bean) = false
Run Code Online (Sandbox Code Playgroud)
什么可能导致这种奇怪的行为?
public class Address extends DtoImpl<Long, Long> implements Serializable{
<fields>
<getters and setters>
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + StringUtils.trimToEmpty(street).hashCode();
result = prime * result + StringUtils.trimToEmpty(town).hashCode(); …Run Code Online (Sandbox Code Playgroud) 作为公认的一部分JDK 10本JEP 312:线程局部握手提出.
我试图理解它的描述,但我仍然不相信我的想法是正确的.
它本质上是尝试恢复类似于弃用的Thread.destroy()的东西吗?
这个界面在理论上怎么样?
有没有办法将a转换BigInteger成BigDecimal?
我知道你可以从a BigDecimal到a BigInteger,但是我找不到一种方法可以用Java来反过来.
这对我来说是一种耻辱,但我不知道:
您应该使用clone来复制数组,因为这通常是最快的方法.
正如Josh Bloch在本博客中所述:http://www.artima.com/intv/bloch13.html
我总是用System.arraycopy(...).这两种方法都是原生的,所以可能没有深入到我无法弄清楚的库的来源,为什么会如此.
我的问题很简单:为什么它是最快的方式?
有什么区别这里
解释了不同之处,但它没有回答为什么Josh Bloch认为System.arraycopy?clone()最快的方式.
遵循JEP 286:局部变量类型推断描述
我想知道,引入这种限制的原因是什么,如:
Run Code Online (Sandbox Code Playgroud)Main.java:199: error: cannot infer type for local variable k var k = { 1 , 2 }; ^ (array initializer needs an explicit target-type)
所以对我来说逻辑上它应该是:
var k = {1, 2}; // Infers int[]
var l = {1, 2L, 3}; // Infers long[]
Run Code Online (Sandbox Code Playgroud)
因为Java编译器已经可以正确地推断出数组的类型:
void decide() {
arr(1, 2, 3); // call void arr(int ...arr)
arr(1, 2L, 3); // call void arr(long ...arr)
}
void arr(int ...arr) {
}
void arr(long ...arr) {
} …Run Code Online (Sandbox Code Playgroud) java ×9
arrays ×2
java-10 ×2
assertthat ×1
aws-lambda ×1
bigdecimal ×1
biginteger ×1
clone ×1
concurrency ×1
containskey ×1
copy ×1
hamcrest ×1
hashmap ×1
hibernate ×1
java-threads ×1
jpa ×1
junit5 ×1
lazy-loading ×1
spring ×1
spring-mvc ×1