Spring Security-все запросы jQuery Ajax post возвращают 404
все мои $.ajax
, и POST
и GET
работали нормально, но как только я интегрировал Spring security 3.2.6
в моем проекте POST
ajax запросы перестали работать без loggin каких-либо проблем.
весна-безопасности.в XML
<beans:beans xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/security"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.2.xsd">
<!--Permit all Web resources to bypass proxy-->
<http pattern="/js/**" security="none"/>
<http pattern="/css/**" security="none"/>
<http pattern="/fonts/**" security="none"/>
<http pattern="/images/**" security="none"/>
<http auto-config="true" use-expressions="true" >
<intercept-url pattern="/login" access="isAnonymous()"/>
<intercept-url pattern="/workflow**" access="hasRole('ROLE_WORKFLOW_ADMIN')"/>
<intercept-url pattern="/**" access="hasAnyRole('ROLE_ADMIN','ROLE_WORKFLOW_ADMIN','ROLE_DMS_ADMIN')"/>
<access-denied-handler error-page="/403"/>
<form-login
login-page="/login"
default-target-url="/dashboard"
authentication-failure-url="/login?error"
username-parameter="username"
password-parameter="password"/>
<logout invalidate-session="true" logout-success-url="/login?logout"/>
<csrf/>
</http>
<!-- Select users and user_roles from database -->
<authentication-manager>
<authentication-provider ref="daoAuthenticationProvider"/>
</authentication-manager>
<beans:bean id="daoAuthenticationProvider"
class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
<beans:property name="userDetailsService" ref="authService"/>
</beans:bean>
</beans:beans>
Web.в XML
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>mvc-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/mvc-dispatcher-servlet.xml
/WEB-INF/spring-security.xml
</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/error</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/error</location>
</error-page>
</web-app>
редактировать
URL, к которому я пытаюсь получить доступ, -
может ли это быть чем-то с spring security ?
3 ответов
наконец, после трех мучительных дней, я нашел проблему и мальчик был глуп.
проблема заключалась в том, что я включил csrf
защита весной безопасности. И это привело к тому, что мои почтовые запросы были запрещены, что вызывает access-denied-handler
страница ошибки, так как я не сопоставил мой access-denied-handler
до "/403"
страница ошибки, как показано ниже, my http 403/401
был замаскирован http 404
<access-denied-handler error-page="/403"/>
короче
- карту
access-denied-handler
страница ошибки к допустимому url - если вы используете защиту csrf, всегда убедитесь, что вы передаете их в запросе AJAX post как таковой
$.данные технологии Ajax({метод :'пост', URL-адрес : '/Аякс', : {"${_csrf.parameterName}": "${_csrf.token}"}});
есть еще одна ситуация, с которой необходимо проконсультироваться специально, когда вы реализуете spring security 4, нужна кнопка формы (а не "href").
a> форма post запрос отправлен: тип ввода скрыт в и вход/выход кнопки
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
B> для запроса AJAX post добавьте следующее на страницу JSP после taglib декларативные заявления.
<meta name="_csrf" content="${_csrf.token}" />
<meta name="_csrf_header" content="${_csrf.headerName}" />
и кое-где выше закрытия тело тег в jsp любой где как он "наготове"
<script type="text/javascript">
$(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);
});
});
</script>
это должно работать! если у вас остались проблемы с CORS, см. статью ниже. http://www.html5rocks.com/en/tutorials/cors/
вы пытались опубликовать с помощью обычного http-запроса для использования spring security вы должны использовать определенный набор имен переменных, которые вы можете google .
также проверьте, можем ли мы отправить запрос post на ограниченный URL с помощью AJAX.