java post 403_java – HTTP状态403 – 在请求参数上找到无效的CSRF令牌“null”

我必须向我的restful服务发出HTTP.Post(Android App),以注册新用户!

问题是,当我尝试向注册终端发出请求(没有安全性)时,Spring一直阻止我!

我的项目依赖关系

MysqL.connector.version>5.1.30MysqL.connector.version>

春季安全

调节器

@RestController

@RequestMapping(value="/webapi/cadastro",produces="application/json")

public class CadastroController {

@Autowired

UsuarioService usuarioService;

Usuario u = new Usuario();

@RequestMapping(value="/novo",method=RequestMethod.POST)

public String register() {

// this.usuarioService.insert(usuario);

// usuario.setPassword(HashMD5.criptar(usuario.getPassword()));

return "teste";

}

}

JS Post(Angular)

$http.post('/webapi/cadastro/novo').success(function(data) {

alert('ok');

}).error(function(data) {

alert(data);

});

而错误

HTTP Status 403 - Invalid CSRF Token 'null' was found on the request parameter '_csrf' or header 'X-XSRF-TOKEN'.

—解决方案—

实现了一个过滤器,将我的X-XSRF-TOKEN连接到每个请求标头

public class CsrfHeaderFilter extends OncePerRequestFilter {

@Override

protected void doFilterInternal(HttpServletRequest request,HttpServletResponse response,FilterChain filterChain)

throws ServletException,IOException {

CsrfToken csrf = (CsrfToken) request.getAttribute(CsrfToken.class

.getName());

if (csrf != null) {

Cookie cookie = WebUtils.getCookie(request,"XSRF-TOKEN");

String token = csrf.getToken();

if (cookie==null || token!=null && !token.equals(cookie.getValue())) {

cookie = new Cookie("XSRF-TOKEN",token);

cookie.setPath("/");

response.addCookie(cookie);

}

}

filterChain.doFilter(request,response);

}

}

添加到此过滤器的映射到web.xml并完成!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个使用 Java 编写的 CSRF 过滤器的示例代码: ```java import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; import java.util.UUID; public class CsrfFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { // 初始化操作,如果需要的话 } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; HttpServletResponse httpResponse = (HttpServletResponse) response; if (httpRequest.getMethod().equalsIgnoreCase("POST")) { HttpSession session = httpRequest.getSession(false); String csrfToken = httpRequest.getParameter("csrfToken"); if (session == null || csrfToken == null || !csrfToken.equals(session.getAttribute("csrfToken"))) { httpResponse.sendError(HttpServletResponse.SC_FORBIDDEN, "Invalid CSRF Token"); return; } } chain.doFilter(request, response); } @Override public void destroy() { // 销毁操作,如果需要的话 } } ``` 在上述示例中,`CsrfFilter` 是一个实现了 `javax.servlet.Filter` 接口的过滤器。它会拦截所有的请求,并在 POST 请求中验证 CSRF 令牌的有效性。 你可以在 `web.xml` 文件中配置该过滤器,例如: ```xml <filter> <filter-name>CsrfFilter</filter-name> <filter-class>com.example.CsrfFilter</filter-class> </filter> <filter-mapping> <filter-name>CsrfFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` 这样,所有的请求都会通过 `CsrfFilter` 进行过滤,并在需要的时候进行 CSRF 令牌的验证。 请注意,这只是一个简单的示例,你可能需要根据你的应用程序和框架进行适当的调整。确保在生成 CSRF 令牌时使用安全的随机数生成算法,并在验证令牌时采取适当的安全措施。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值