我正在使用Extjs-6和Spring 4开发一个应用程序,我的应用程序是Restful的。
我启用CORS的来源如下:
public class CorsFilter extends OncePerRequestFilter {
private static final String ORIGIN = "Origin";
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
response.addHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.addHeader("Access-Control-Max-Age", "10");
String reqHead = request.getHeader("Access-Control-Request-Headers");
if (!StringUtils.isEmpty(reqHead)) {
response.addHeader("Access-Control-Allow-Headers", reqHead);
}
if (request.getMethod().equals("OPTIONS")) {
try {
response.getWriter().print("OK");
response.getWriter().flush();
} catch (IOException e) {
e.printStackTrace();
}
} else{
filterChain.doFilter(request, response);
}
}
}过滤器配置:
<security:http use-expressions="true">
...
<sec:custom-filter ref="CorsFilter" before="HEADERS_FILTER"/>
</security:http>而豆子:
<bean id="CorsFilter" class="..." />我希望用户使用AJAX请求。我使用高级REST客户端和http请求者测试ajax请求。延长的结果如下:


Ext Ajax请求代码如下:
Ext.Ajax.request({
url: "http://localhost/Calk/j_spring_security_check",
// params: {
// "j_username": "ali",
// "j_password": "123456"
// },
params: "j_username=ali&j_password=123456",
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
method: "POST",
success: function(){...},
failure: function(){...}
});当我发送请求时,它得到了200 OK,我在客户端插入了应用程序,并发送了一些请求来获取一些数据。但是所有这些请求的服务器都会获得401 Unauthorized。
的问题是什么
重要更新:
登录请求如下:

服务器设置cookie作为响应,并获得授权的数据请求如下所示:

为什么
发布于 2016-04-18 06:54:57
Spring安全性工作如下所示:
如果来自客户端的任何请求都没有JSessionID cookie,Spring将重置该客户端的会话并为it.Then设置无效会话--下一个请求将与该无效会话一起发送。
因此,您需要在所有Ext请求中设置cookie。我想一些并发ajax请求不会发送cookie。为了在所有ajax请求中设置cookie,可以添加以下事件:
Ext.Ajax.on("beforerequest",function(con){
con.setUseDefaultXhrHeader(false);
con.setWithCredentials(true);
}此函数在发送所有ajax请求之前运行。
发布于 2016-04-13 23:50:48
错误的原因是您正在提出跨域请求。我认为您的javascript应用程序运行在不同的端口上,而您的应用服务器运行在8084上。
为此,需要启用CORS对应用程序的支持。这是你怎么做到的。
@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**");
}
}按照这个链接详细解释。在大多数情况下,这应该适用于您,如果spring -安全性仍然是复杂的,那么您可能需要为spring安全性添加过滤器。你可以用按照这个答案来做
public class CorsFilter extends OncePerRequestFilter {
private static final String ORIGIN = "Origin";
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
if (request.getHeader(ORIGIN) == null || request.getHeader(ORIGIN).equals("null")) {
response.addHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.addHeader("Access-Control-Max-Age", "10");
String reqHead = request.getHeader("Access-Control-Request-Headers");
if (!StringUtils.isEmpty(reqHead)) {
response.addHeader("Access-Control-Allow-Headers", reqHead);
}
}
if (request.getMethod().equals("OPTIONS")) {
try {
response.getWriter().print("OK");
response.getWriter().flush();
} catch (IOException e) {
e.printStackTrace();
}
} else{
filterChain.doFilter(request, response);
}
}
}配置安全筛选器
<security:http use-expressions="true" .... >
...
//your other configs
<sec:custom-filter ref="corsFilter" before="HEADERS_FILTER"/>
</security:http>将过滤器公开为Bean
<bean id="corsFilter" class="<<location of the CORS filter class>>" />https://stackoverflow.com/questions/36594371
复制相似问题