我正在编写Spring REST类型接口到数据库的过程中,该数据库将检索各种资源的用户特定结果。Spring Rest Web请求范围
为了容纳用户,我有一个名为CurrentUser的弹簧@Component注释bean作为临时度量。
@Component
public class CurrentUser {
@Autowired
private UserDAO userDAO;
private String userId;
private String email;
private String notes;
public String getUserId() {
return userId;
}
public void setUserId(String userId) throws ApiException {
User user = userDAO.getUser(userId) // Database call to
if (!user.isValid()) {
throw ApiException(...) // The exception would crash back to the user as a error in the response
}
// Valud user so set these aspects.
this.userId = user.userId;
this.email = user.email;
}
}
在使用以下拦截器对API中的任何方法进行每次调用时,都会在Spring Interceptor中初始化此对象。
public class AuthenticationInterceptor extends HandlerInterceptorAdapter {
@Autowired
private CurrentUser user;
@Autowired
private RequestParameters requestParameters;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ApiException {
user.setUserId(StringUtils.defaultString(request.getParameter("userId"), "defaultUser"));
return true;
}
}
这只是一个识别用户的位置持有者,直到可以添加正确的身份验证。
我是比较新的春天,而这个职位 的原因是为了增加我的春天的线程安全方面的了解,情况是这样
我最近发现,春天不会自动线程安全,我可能需要更多地考虑范围。
我想了解的是以下几点:
对于上面的设置,有没有危险,同时提出请求的1000,可能会干扰和相互覆盖? 例如对于一个用户的请求可能会被不同的用户从单独的http请求覆盖,导致请求者接收到错误的数据。
什么是解决这个问题的最佳方法。 (即使它将被替换,我也有类似的方式实例化其他对象) 我正在看的选项(如果这是一个问题),设置原型范围或直接附加到请求/会话而不是允许他们拥有自动装配的对象。
任何人都可以给我的任何信息都会非常感谢,因为我一开始就想让它变得正确(呃),而不是稍后处理不好的假设。
我们甚至有这种怀疑并有严格的批量测试,发现春天默认情况下不处理基于请求的数据。因此,在项目和服务层中启用基于事务的配置。 您也可以在请求范围中配置bean,理想情况下,它们具有将同步块放入方法中的类似效果。 – Jango