我有一个简单的RESTAPI,可以与数据库一起使用。它工作正常,直到我添加了安全部分。现在它给出了HTTP 405不允许在POST和DELETE请求上使用。我不知道为什么。GET请求工作正常。
这是控制器类:
@Controller
public class MarkerController {
private Logger logger = Logger.getLogger(MarkerController.class.getName());
@Autowired
private MarkerServiceInterface markerService;
@RequestMapping(value="/markers", method=RequestMethod.GET)
public @ResponseBody List<Marker> getMarkers(@RequestParam(value="city", defaultValue="") String city) {
logger.info("HANDLE GET REQUEST");
return this.markerService.getAllMarkers();
}
@RequestMapping(value="/markers/new", method=RequestMethod.POST)
public @ResponseBody Marker addMarker(@RequestBody Marker marker) {
logger.info("HANDLE POST REQUEST");
this.markerService.addMarker(marker);
return marker;
}
@RequestMapping(value="/markers/delete", method=RequestMethod.DELETE)
public @ResponseBody String deleteMarker(@RequestParam(value="id", defaultValue="") String id) {
logger.info("HANDLE DELETE REQUEST");
if (!id.equals("")) {
logger.info(id);
this.markerService.deleteMarker(Long.parseLong(id));
}
return "";
}
@RequestMapping(value="/admin/map")
public String trafficSpy() {
logger.info("HANDLE MAP");
return "index";
}
@RequestMapping(value="/admin")
public String admin() {
return "admin";
}
@RequestMapping(value="/login")
public String login() {
return "login";
}
}
这是SecurityConfig:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
@Qualifier("userDetailsService")
UserDetailsService userDetailsService;
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth)
throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(
passwordEncoder());
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/admin/**")
.access("hasRole('ROLE_ADMIN')")
.antMatchers("/markers/**")
.access("hasRole('ROLE_USER')")
.and()
.formLogin()
.loginPage("/login")
.failureUrl("/login?error")
.usernameParameter("username")
.passwordParameter("password")
.and()
.logout()
.logoutSuccessUrl("/login?logout")
.and()
.csrf()
.and()
.exceptionHandling()
.accessDeniedPage("/403");
}
@Bean
public PasswordEncoder passwordEncoder() {
PasswordEncoder encoder = new BCryptPasswordEncoder();
return encoder;
}
@Bean
public DaoAuthenticationProvider authProvider() {
DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
authProvider.setUserDetailsService(userDetailsService);
authProvider.setPasswordEncoder(passwordEncoder());
return authProvider;
}
}
使用以下ajax代码调用删除请求:
$.ajax({
url: "localhost:8080/markers/delete?id=" + currentMarker.get("id"),
type: 'DELETE',
success: function(result) {
console.log(result);
}
});
以下是控制台中给出的消息:
2015-05-11 15:48:13.671 WARN 8279 --- [nio-8181-exec-6] o.s.web.servlet.PageNotFound : Request method 'DELETE' not supported
这些是响应的标头。我可以看到在AlLLOW中我只有GET和HEAD。所以如果我是对的,这意味着控制器中的方法只接受GET和HEAD请求。
(Status-Line) HTTP/1.1 405 Method Not Allowed
Server Apache-Coyote/1.1
x-content-type-options nosniff
x-xss-protection 1; mode=block
Cache-Control no-cache, no-store, max-age=0, must-revalidate
Pragma no-cache
Expires 0
X-Frame-Options DENY
Allow GET, HEAD
Content-Type application/json;charset=UTF-8
Transfer-Encoding chunked
Date Mon, 11 May 2015 17:35:31 GMT
在回答中,我有一个例外:
org.springframework.web.HttpRequestMethodNotSupportedException
知道是什么导致了这个问题吗?如何允许POST和DELETE方法?
在我的例子中,协议必须是https,而不是http
我想留下一个额外的解决方案,因为虽然马努齐的答案是正确的,但我现在还不清楚为什么我第一次遇到这个问题并找到了这个答案。
潜在问题被405方法不允许的直接问题所掩盖。
在我的例子中,有两个因素在起作用。首先,我的AccessDenied控制器没有POST方法,当POST方法被拒绝并重定向到AccessDenied控制器时,会导致405。这只有在org.springframework.web
上打开调试日志记录后才明显。
一旦弄清楚了,就需要弄清楚为什么我的访问被拒绝了。所有的权限和角色都是正确的,但是从Spring 3升级到4后,我发现CSRF保护默认启用。要么需要禁用,要么必须使用Manu zi的解决方案。
要禁用它,请参阅:spring security 4 csrf disable via html" target="_blank">xml
您忘记了csrf
-Token。
建议您在meta标记中添加csrf令牌。您可以在Spring Security文档中阅读它
有了它,您可以执行以下操作:
$(function () {
var token = $("meta[name='_csrf']").attr("content");
var header = $("meta[name='_csrf_header']").attr("content");
$(document).ajaxSend(function(e, xhr, options) {
xhr.setRequestHeader(header, token);
});
});
问题内容: 我看到以下错误: 使用此代码: 是什么原因引起的,如何解决? 问题答案: 在当前域之外发出ajax请求时,Javascript是受限制的。 例1:您的域名为example.com,并且您想向test.com提出请求=>您不能。 例2:您的域名是example.com,并且您想向inner.example.com发送请求,但是您不能。 例3:您的域名为example.com:80,并且您
我有一个使用调用的进程。此任务被提交给executor服务。我允许进程在尝试取消它之前有x秒的运行时间。但是,当我调用并且任务在方法中等待时,线程/任务不会被取消。 我已经对代码进行了测试,如果将替换为,则会得到。但是,当任务位于内时,不会出现中断。在face中,直到Restful调用完成,该方法才返回。 我看到了这篇文章,取消、中止、中断一个spring android resttemplate
问题内容: 我正在尝试在用户空间中使用mmap读取“ mem_map”开始的物理内存。它是一个包含所有物理页面的数组。这是一台运行3.0内核的i386计算机。 代码是这样的: 我以此为根。输出为: 可以肯定的是,我搜索了问题并将以下行添加到我的/etc/sysctl.conf文件中: 但这也不起作用。 谁知道为什么不允许这样的mem_map操作,以及如何解决呢? 谢谢。 问题答案: 听起来好像内核
我尝试使用systemctl命令构建CentOS映像。但是每次我构建它时。我得到这个错误: 我的Dockerfile: centos\u systemctl:最新版本:https://github.com/docker-library/docs/tree/master/centos#systemd-集成 有人知道我做错了什么吗? 谢谢
我为Select创建了动态DB2存储过程。我将使用这个泛型查询通过传递参数来执行多个select语句。 下面是我的查询的样子。 当我运行这个的时候
以下是我所做的: 提前致谢
我一直在捕捉非数字时遇到问题。 我试过了,但抓不住。如果我让它捕获非数字,但不让用户再次尝试输入。。。它完全停止了我的代码。 这是我的密码:
此url位于AWS API网关中,方法为get,stage部署良好。我在aws文档之后启用了CORS。 -资源->操作->启用CORS->默认设置->启用CORS并替换CORS头。在CORS结果中没有错误日志。 我不是profesional web开发人员,我的浏览器是Safari。 以下是我查询“http://my.com”的代码 控制台打印错误:XMLHttpRequest不能加载“http: