CSRF:如何从后端将JAX-RS中名为XSRF-TOKEN的cookie设置为与前端的AngularJS一起使用

CSRF:如何从后端将JAX-RS中名为XSRF-TOKEN的cookie设置为与前端的AngularJS一起使用,angularjs,rest,csrf,Angularjs,Rest,Csrf,我的应用程序在前端使用AngularJS,在后端使用Java RESTful web服务。我们正在尝试使用XSRF-TOKEN来防止跨站点请求伪造 在前端,我添加了angular-cookies.js,并将ngCookies依赖项包含在我的“模块”中 angular.module('myapp.list', ['ngCookies']) .controller('ListCtrl', ['$scope', '$http', '$location', function CoiListCtrl($

我的应用程序在前端使用AngularJS,在后端使用Java RESTful web服务。我们正在尝试使用XSRF-TOKEN来防止跨站点请求伪造

在前端,我添加了angular-cookies.js,并将ngCookies依赖项包含在我的“模块”中

angular.module('myapp.list', ['ngCookies'])
 .controller('ListCtrl', ['$scope', '$http', '$location', function CoiListCtrl($scope, $http, $location) {
   //some functions
  })
.run(['$http', '$cookies', function($http, $cookies) {
//check if the header X-XSRF-TOKEN is already set by AngularJS
console.log($http.defaults.headers.post['X-XSRF-TOKEN']);
    debugger;
}]);
在前端,我无法通过以下两种方式看到我在后端创建的cookie:

1. 使用
HttpServletResponse
对象,但这样我不确定如何将其发送回UI,因为我们没有使用类似于
httpResponse.sendRedirect(url)的任何东西

2. 在典型JAX-RS服务中使用
ResponseBuilder.build()
方法返回响应时,将cookie添加到
ResponseBuilder

ResponseBuilder responseBuilder = Response.temporaryRedirect(new URI(redirectUrl));
NewCookie abc = new NewCookie("XSRF-TOKEN", String.valueOf(Math.random()));
responseBuilder.cookie(abc);
return responseBuilder.build();

请有人帮我创建有效的cookie并使用它们。

您可以添加自己的ServletFilter实现,在这里您将检查CRSF头和CSRF cookie的存在,并检查它们是否相互匹配。 代码示例:

boolean isRequestContainsValidCsrfToken(HttpServletRequest request) {
        String authCookie = Arrays.stream(request.getCookies())
                .filter(cookie -> cookie.getName().equals(COOKIE_NAME))
                .findFirst()
                .map(Cookie::getValue)
                .orElse(null);
        String authHeader = request.getHeader(X_CSRF_TOKEN);
        

        return authCookie != null && authCookie.equals(authHeader);
    } 
boolean isRequestContainsValidCsrfToken(HttpServletRequest request) {
        String authCookie = Arrays.stream(request.getCookies())
                .filter(cookie -> cookie.getName().equals(COOKIE_NAME))
                .findFirst()
                .map(Cookie::getValue)
                .orElse(null);
        String authHeader = request.getHeader(X_CSRF_TOKEN);
        

        return authCookie != null && authCookie.equals(authHeader);
    }