首页 > 解决方案 > 在 Spring MVC 中,当我点击 CURL 然后在 Spring MVC 中出现错误

问题描述

我有一个卷曲类型的网址,

curl -i -X GET -H Accept:application/json http://localhost:8080/onyxcxm/admin/getDTMF/2

当我点击 url 并得到响应时,

HTTP/1.1 302

X-Content-Type-Options: nosniff

X-XSS-防护:1;模式=块

缓存控制:无缓存,无存储,最大年龄=0,

must-revalidate Pragma: no-cache

过期:0 X-Frame-选项:SAMEORIGIN

位置:http://localhost:8080/onyxcxm/login

内容长度:0

日期:2018 年 10 月 4 日星期四 11:36:48 GMT

在这里我的控制器喜欢,

@RequestMapping(value="/getDTMF/{dtmf}",headers = "Accept=application/json")
@ResponseBody
public ResponseEntity<String> getDTMF(@PathVariable("dtmf") String dtmf) {
    System.err.println("Pressed digit is "+dtmf);
    HttpHeaders headers = new HttpHeaders();
    headers.add("Content-Type", "application/json; charset=utf-8");
    return new ResponseEntity<String>(null, headers, HttpStatus.OK);
}

我的安全配置是,

protected void configure(HttpSecurity http) throws Exception {
    http
    .headers().addHeaderWriter(
            new XFrameOptionsHeaderWriter(
            XFrameOptionsHeaderWriter.XFrameOptionsMode.SAMEORIGIN))
            .and()
    .authorizeRequests()
    .antMatchers("/admin/**").access("hasRole('ADMIN')")
    .antMatchers("/user/**").access("hasRole('USER')")
    .and()
    .formLogin()
    .loginPage("/login")
    .loginProcessingUrl("/j_spring_security_check")
    .successHandler(authenticationSuccessHandler())
    .failureUrl("/login?error")
    .usernameParameter("username")
    .passwordParameter("password")
    .and()
    .logout()
    .logoutUrl("/j_spring_security_logout")
    .logoutSuccessHandler(logoutSuccessHandler())
    .logoutSuccessUrl("/login?logout")
    .invalidateHttpSession(true)
    .and()
    .csrf().disable();
}

我不认为我为什么会收到此错误,任何人都可以解决它吗?谢谢。

标签: javaspringspring-mvccurl

解决方案


您正在经历的行为是您自己设计的。您正在请求路径“/admin/**”下的页面,该页面需要根据您设置的安全配置进行身份验证。

所以这就是 Spring 正在做的事情:

  • 检查您是否有有效的身份验证令牌
  • 如果存在,则允许将调用传递给 @Controller 和 @RequestMapping
  • 如果不重定向到配置的登录页面(在您的情况下为“/login”)

由于您没有提供任何安全令牌(可以通过 /login 页面上的登录获得,并且应该在标头中传递)Spring 将 CURL 请求重定向到配置的登录页面。状态码 302 的意思就是,将用户重定向到指定的页面。

对于基本身份验证,添加标题“Authorization: userHash”,在其中将 userHash 替换为 <username>:<password> 的 base64 编码字符串。有关如何使用标头的更多信息,请参阅 wikipedia Basic Access Authentication 。


推荐阅读