首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Ext.Ajax登录到spring安全性?

如何使用Ext.Ajax登录到spring安全性?
EN

Stack Overflow用户
提问于 2016-04-13 09:37:06
回答 3查看 1.2K关注 0票数 4

我正在使用Extjs-6和Spring 4开发一个应用程序,我的应用程序是Restful的。

我启用CORS的来源如下:

代码语言:javascript
复制
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);
        }
    }
 }

过滤器配置:

代码语言:javascript
复制
<security:http use-expressions="true">
    ...
    <sec:custom-filter ref="CorsFilter" before="HEADERS_FILTER"/>
</security:http>

而豆子:

代码语言:javascript
复制
<bean id="CorsFilter" class="..." />

我希望用户使用AJAX请求。我使用高级REST客户端http请求者测试ajax请求。延长的结果如下:

Ext Ajax请求代码如下:

代码语言:javascript
复制
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作为响应,并获得授权的数据请求如下所示

为什么

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-04-18 06:54:57

Spring安全性工作如下所示:

如果来自客户端的任何请求都没有JSessionID cookie,Spring将重置该客户端的会话并为it.Then设置无效会话--下一个请求将与该无效会话一起发送。

因此,您需要在所有Ext请求中设置cookie。我想一些并发ajax请求不会发送cookie。为了在所有ajax请求中设置cookie,可以添加以下事件:

代码语言:javascript
复制
Ext.Ajax.on("beforerequest",function(con){
  con.setUseDefaultXhrHeader(false);
  con.setWithCredentials(true);
}

此函数在发送所有ajax请求之前运行。

票数 1
EN

Stack Overflow用户

发布于 2016-04-13 23:50:48

错误的原因是您正在提出跨域请求。我认为您的javascript应用程序运行在不同的端口上,而您的应用服务器运行在8084上。

为此,需要启用CORS对应用程序的支持。这是你怎么做到的。

代码语言:javascript
复制
@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**");
    }
}

按照这个链接详细解释。在大多数情况下,这应该适用于您,如果spring -安全性仍然是复杂的,那么您可能需要为spring安全性添加过滤器。你可以用按照这个答案来做

代码语言:javascript
复制
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);
        }
    }
 }

配置安全筛选器

代码语言:javascript
复制
<security:http use-expressions="true" .... >
    ...
    //your other configs
    <sec:custom-filter ref="corsFilter" before="HEADERS_FILTER"/>
</security:http>

将过滤器公开为Bean

代码语言:javascript
复制
<bean id="corsFilter" class="<<location of the CORS filter class>>" />
票数 2
EN

Stack Overflow用户

发布于 2016-04-18 05:37:00

我认为问题在于会话cookie是为/Calk/路径设置的,而ajax调用是从/Workspace/Calk/发出的。因此,您需要找到在Spring中配置会话cookie路径的位置,并将其更改为/

我没有使用security,但是通过快速搜索,问题似乎表明您可以在web.xml中更改路径

代码语言:javascript
复制
<web-app>
    <session-config>
        <cookie-config>
            <path>/</path>
        </cookie-config>
    </session-config>
</web-app>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36594371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档