我的应用程序在前端使用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:
使用HttpServletResponse
对象,但这样我不确定如何将其发送回用户界面,因为我们没有使用httpResponse.sendRedirect(url);
@Context
HttpServletResponse httpResponse;
httpResponse.addCookie(new Cookie("XSRF-TOKEN", String.valueOf(Math.random()));
在我们使用典型JAX-RS服务中的ResponseBuilder
方法返回响应时,将Cookie添加到responseBuilder.build()
ResponseBuilder responseBuilder = Response.temporaryRedirect(new URI(redirectUrl));
NewCookie abc = new NewCookie("XSRF-TOKEN", String.valueOf(Math.random()));
responseBuilder.cookie(abc);
return responseBuilder.build();
有人可以帮我创建有效的Cookie并使用它们。
答案 0 :(得分:0)
您可以添加自己的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);
}