小编Rob*_*erd的帖子

推荐的AJAX,CORS,Chrome和HTTP错误代码解决方案(401,403,404,500)

背景

(如果您熟悉CORS,最后可以跳到问题)

CORS [1]是一种允许浏览器允许访问来自不同域的资源的解决方案.例如,使用AJAX的REST数据后端.

在互联网上很好地观察到Chrome(和Webkit好友)在这样的资源需要时不处理HTTP身份验证提示.例如[2](这是为了防止浏览器显示auth登录对话框,例如,当图像标签加载失败并且需要凭据时,Web-Mail登录页面.用户可能被欺骗进入他们的网络邮件凭据)

Chrome在这种情况下的行为是放弃响应,几乎无声地取消请求.

事实上,如果发生200,Chrome只会正常通过响应; 吞下任何其他状态代码并中止AJAX调用.

如果使用jQuery执行Ajax请求,并且远程站点使用HTTP 401状态代码进行响应,则取消请求并且ajax完成并出现错误,但缺少401代码.好像连接死了或等同的下层问题.

我见过的唯一一个提到CORS这个警告的网站是[1]

浏览器在报告错误时没有很好地报告出错的地方.例如,Firefox报告所有错误的状态为0和空状态文本.浏览器还会向控制台日志报告错误消息,但无法从JavaScript访问此消息.处理错误时,您将知道发生了错误,但没有其他错误.

您可以通过使用chrome启动标志来禁用此安全性 - 只是为了测试后端是否正常运行,并且一个健全状态不会因丢失正确的状态代码而受到不适当的影响.见[2]

问题

如果后端和前端客户端代码应该使用401作为其身份验证过程的一部分,该怎么办? - 任何失败只会被误导成一个"错误"输出.

例如:在发出身份验证请求时 - 例如,双腿OAuth令牌请求 - 对使用正确状态代码的RESTful后端 - 客户端不知道是否:

  • 401用户未经过身份验证.
  • ---连接失败.
  • 400有一个糟糕的要求.
  • 500服务器有问题.
  • 207成功后没有内容.

我们的后端写得相当 RESTful,遵循当时认为具有成本效益的最佳实践; 其中一个依赖于正确的HTTP状态代码.我们反对的Java REST客户端运行良好.

现在我已经开始创建一个Javascript客户端,用于嵌入网页 - 特别是使用CORS,我们已经解决了Chrome等问题.(注意Firefox 似乎很好,我们目前通常不关心IE.)

人们为解决这些问题做了什么?
有什么办法可以使CORS更适合可信赖的后端吗?

链接

  1. CORS教程:http://www.html5rocks.com/en/tutorials/cors/
  2. Chrome不允许使用401触发的身份验证提示:http://code.google.com/p/chromium/issues/detail?id = 81251
  3. - Chrome的禁用网络安全:在Chrome中禁用相同的来源政策

javascript google-chrome cors

15
推荐指数
2
解决办法
8636
查看次数

每个请求的Spring会话创建策略?

TL; DR

是否可以基于每个请求在Spring(安全性)中控制会话创建策略?

长版......

我一直在为我们的应用程序使用普通登录表单用户身份验证 一些控制器是@RestControllers,到目前为止,cookie跟踪的默认用户会话允许它正常工作.

(即当XHR请求来自页面时,请求将通过以前登录的用户进行身份验证,因为浏览器会像往常一样发送JSESSIONID cookie)

我现在想允许从休息客户端而不是浏览器调用一些@RestController端点,所以我创建了一个API令牌认证方案 - 这很好.

清理的最后一点是REST调用生成一个会话,如果可能的话我想避免.

我无法将会话策略设置为永远(因为我仍然依赖于我的网络用户的会话).

我试过IF_REQUIRED无济于事.

我查看了HttpSessionSecurityContextRepository,但它包装了请求,每当刷新响应时都会创建一个会话.

(参见下面的stacktrace)

是否可以在其他地方根据请求挂钩会话管理?

我可以根据Authentication对象的类类型轻松区分请求的类型.

at myapp.cfg.WebConfig$1.sessionCreated(WebConfig.java:74)
at io.undertow.servlet.core.ApplicationListeners.sessionCreated(ApplicationListeners.java:300)
at io.undertow.servlet.core.SessionListenerBridge.sessionCreated(SessionListenerBridge.java:56)
at io.undertow.server.session.SessionListeners.sessionCreated(SessionListeners.java:52)
at io.undertow.server.session.InMemorySessionManager.createSession(InMemorySessionManager.java:187)
at io.undertow.servlet.spec.ServletContextImpl.getSession(ServletContextImpl.java:741)
at io.undertow.servlet.spec.HttpServletRequestImpl.getSession(HttpServletRequestImpl.java:370)
at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:270)
at org.springframework.security.web.context.HttpSessionSecurityContextRepository$SaveToSessionResponseWrapper.createNewSessionIfAllowed(HttpSessionSecurityContextRepository.java:427)
at org.springframework.security.web.context.HttpSessionSecurityContextRepository$SaveToSessionResponseWrapper.saveContext(HttpSessionSecurityContextRepository.java:364)
at org.springframework.security.web.context.SaveContextOnUpdateOrErrorResponseWrapper.onResponseCommitted(SaveContextOnUpdateOrErrorResponseWrapper.java:85)
at org.springframework.security.web.util.OnCommittedResponseWrapper.doOnResponseCommitted(OnCommittedResponseWrapper.java:245)
at org.springframework.security.web.util.OnCommittedResponseWrapper.access$000(OnCommittedResponseWrapper.java:33)
at org.springframework.security.web.util.OnCommittedResponseWrapper$SaveContextServletOutputStream.flush(OnCommittedResponseWrapper.java:512)
at org.springframework.security.web.util.OnCommittedResponseWrapper$SaveContextServletOutputStream.flush(OnCommittedResponseWrapper.java:513)
at com.fasterxml.jackson.core.json.UTF8JsonGenerator.flush(UTF8JsonGenerator.java:1050)
at com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:953)
Run Code Online (Sandbox Code Playgroud)

java spring spring-security

7
推荐指数
1
解决办法
2094
查看次数

Azure磁盘大小太小.Linux基本A0只有29GB

我刚刚在Azure(东南亚)创建了一个linux(Ubuntu 14.4)虚拟机

问题:我只有29GB而不是127GB

这是一个基本层,A0(最小尺寸)

宣传的磁盘驱动器大小为127GB(+ 20GB tmp)

http://msdn.microsoft.com/en-us/library/azure/dn197896.aspx

我发现(耗尽磁盘空间后)我只有29GB左右.

Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        29G   24G  4.1G  86% /
none            4.0K     0  4.0K   0% /sys/fs/cgroup
udev            323M   12K  323M   1% /dev
tmpfs            68M  388K   67M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none            336M     0  336M   0% /run/shm
none            100M     0  100M   0% /run/user
/dev/sdb1        20G  4.3G   15G  23% /mnt
Run Code Online (Sandbox Code Playgroud)

运行cfdisk显示驱动器上没有其他可用空间.

我找不到任何文件建议为什么只有29GB.

这是我的VM的错误/问题/问题吗?

或者它与linux/ubuntu 14.4 /基本层A0有什么关系?

azure

6
推荐指数
1
解决办法
5318
查看次数

我应该同时使用SocialAuthenticationFilter和ProviderSignInController吗?

简而言之

使用ProviderSigninController时不会触发身份验证事件.如何使用完整的Spring安全集成?

长版

据我所知,我有一个功能性的Spring-social设置如下:

ProviderSignInController设置为创建社交连接,并在新用户出现时自动配置用户帐户.我使用SignInAdapter,如文档示例所示,

我还使用UserDetailsS​​ervice定期进行基于spring-security的身份验证服务.

但是,我看到的一个区别是社交身份验证登录不会引发任何*AuthenticationEvents.这些事件被过滤器定期账户提高.

我想知道 - 我是否错过了这种整合的一部分?.
看起来有点脆弱,不通过SocialAuthenticationFilter,只需手动设置auth上下文.

我想要一个记录认证事件的中心位置.

java authentication spring spring-security spring-social

6
推荐指数
1
解决办法
1022
查看次数

使用@JsonIdentityInfo时的null ID在反序列化期间失败

我正在使用杰克逊的@JsonIdentityInfo注释来生成漂亮的对象图.

我有以下对象(也是一个hibernate实体):

@Entity
@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, 
                   property="id")
public class MemberFieldDef implements Def
{
    @Id @GeneratedValue(generator="myGen")
    private String id;

   ....
}
Run Code Online (Sandbox Code Playgroud)

这个类在序列化期间工作正常,当时是对象图的一部分,但是当我想通过Jackson提交一个新的瞬态实体时,它还没有ID,并且

{
    "id":null,
    ...
}
Run Code Online (Sandbox Code Playgroud)

反序列化失败了:

com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.lang.String out of VALUE_NULL token
 at [Source: java.io.PushbackInputStream@5950054d; line: 1, column: 2] (through reference chain: net._95point2.sarbase.cohort.entity.MemberFieldDef["id"])
    at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:148)
    at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:762)
    at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:59)
    at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:12)
    at com.fasterxml.jackson.databind.deser.impl.ObjectIdValueProperty.deserializeSetAndReturn(ObjectIdValueProperty.java:90)
    at com.fasterxml.jackson.databind.deser.impl.ObjectIdValueProperty.deserializeAndSet(ObjectIdValueProperty.java:82)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:306)
    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeWithObjectId(BeanDeserializerBase.java:1036)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:122)
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3066)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2221)
    at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:205)
Run Code Online (Sandbox Code Playgroud)

堆栈跟踪显示Jackson没有使用常规的StringDeserializer - 它为文字null返回null - 但是使用的ObjectIdValueProperty似乎不允许空值.

是否有瞬态对象的解决方案?

jackson spring-boot

6
推荐指数
1
解决办法
1050
查看次数

spring @SessionAttributes和“在提交响应后无法创建会话”

我正在尝试设置并获取会话属性,但是我误解了它的工作方式或做错了什么。

请有人解释为什么这行不通。

我有以下简单的Spring Web MVC Controller

@Controller
@SessionAttributes("sessid")
@RequestMapping("sesstest")
public class SessTest 
{
    @RequestMapping("in")
    @ResponseBody
    public String in(ModelMap model){
        String uuid = UUID.randomUUID().toString();
        model.addAttribute("sessid", uuid);
        return uuid;
    }

    @RequestMapping("out")
    @ResponseBody
    public String out(@ModelAttribute("sessid") String sesid){
        return sesid;
    }
}
Run Code Online (Sandbox Code Playgroud)

此类应仅在调用/ sesstest / in时设置会话变量,然后在调用/ sesstest / out时调用它

但是在调用/ in时得到以下异常

(堆栈跟踪显示在控制台上,Web输出正常。)

java.lang.IllegalStateException: Cannot create a session after the response has been committed
    at org.apache.catalina.connector.Request.doGetSession(Request.java:2872)
    at org.apache.catalina.connector.Request.getSession(Request.java:2249)
    at org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:895)
    at org.springframework.web.context.request.ServletRequestAttributes.getSession(ServletRequestAttributes.java:111)
    at org.springframework.web.context.request.ServletRequestAttributes.setAttribute(ServletRequestAttributes.java:161)
    at org.springframework.web.bind.support.DefaultSessionAttributeStore.storeAttribute(DefaultSessionAttributeStore.java:55)
    at org.springframework.web.method.annotation.SessionAttributesHandler.storeAttributes(SessionAttributesHandler.java:124)
    at org.springframework.web.method.annotation.ModelFactory.updateModel(ModelFactory.java:232)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.getModelAndView(RequestMappingHandlerAdapter.java:879)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:782) …
Run Code Online (Sandbox Code Playgroud)

java session spring spring-mvc

4
推荐指数
1
解决办法
3984
查看次数