मुझे @John और @Arpad लिंक और @RobWinch लिंक के उत्तरों का उपयोग करके एक कार्यशील सॉल्यूशन मिला
मैं स्प्रिंग सुरक्षा 3.2.9 और jQuery 1.10.2 का उपयोग करता हूं।
AJAX अनुरोधों से केवल 4XX प्रतिक्रिया देने के लिए स्प्रिंग की कक्षा बढ़ाएँ:
public class CustomLoginUrlAuthenticationEntryPoint extends LoginUrlAuthenticationEntryPoint {
public CustomLoginUrlAuthenticationEntryPoint(final String loginFormUrl) {
super(loginFormUrl);
}
// For AJAX requests for user that isn't logged in, need to return 403 status.
// For normal requests, Spring does a (302) redirect to login.jsp which the browser handles normally.
@Override
public void commence(final HttpServletRequest request,
final HttpServletResponse response,
final AuthenticationException authException)
throws IOException, ServletException {
if ("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))) {
response.sendError(HttpServletResponse.SC_FORBIDDEN, "Access Denied");
} else {
super.commence(request, response, authException);
}
}
}
applicationContext-security.xml
<security:http auto-config="false" use-expressions="true" entry-point-ref="customAuthEntryPoint" >
<security:form-login login-page='/login.jsp' default-target-url='/index.jsp'
authentication-failure-url="/login.jsp?error=true"
/>
<security:access-denied-handler error-page="/errorPage.jsp"/>
<security:logout logout-success-url="/login.jsp?logout" />
...
<bean id="customAuthEntryPoint" class="com.myapp.utils.CustomLoginUrlAuthenticationEntryPoint" scope="singleton">
<constructor-arg value="/login.jsp" />
</bean>
...
<bean id="requestCache" class="org.springframework.security.web.savedrequest.HttpSessionRequestCache">
<property name="requestMatcher">
<bean class="org.springframework.security.web.util.matcher.NegatedRequestMatcher">
<constructor-arg>
<bean class="org.springframework.security.web.util.matcher.MediaTypeRequestMatcher">
<constructor-arg>
<bean class="org.springframework.web.accept.HeaderContentNegotiationStrategy"/>
</constructor-arg>
<constructor-arg value="#{T(org.springframework.http.MediaType).APPLICATION_JSON}"/>
<property name="useEquals" value="true"/>
</bean>
</constructor-arg>
</bean>
</property>
</bean>
मेरे जेएसपी में, एक वैश्विक AJAX त्रुटि हैंडलर जोड़ें जैसा कि यहां दिखाया गया है
$( document ).ajaxError(function( event, jqxhr, settings, thrownError ) {
if ( jqxhr.status === 403 ) {
window.location = "login.jsp";
} else {
if(thrownError != null) {
alert(thrownError);
} else {
alert("error");
}
}
});
इसके अलावा, JSP पृष्ठों में AJAX कॉल से मौजूदा त्रुटि संचालकों को हटा दें:
var str = $("#viewForm").serialize();
$.ajax({
url: "get_mongoDB_doc_versions.do",
type: "post",
data: str,
cache: false,
async: false,
dataType: "json",
success: function(data) { ... },
// error: function (jqXHR, textStatus, errorStr) {
// if(textStatus != null)
// alert(textStatus);
// else if(errorStr != null)
// alert(errorStr);
// else
// alert("error");
// }
});
मुझे उम्मीद है कि यह दूसरों की मदद करता है।
Update1
मैंने पाया कि मुझे फॉर्म-लॉगिन कॉन्फ़िगरेशन में विकल्प (हमेशा-उपयोग-डिफ़ॉल्ट-लक्ष्य = "सही") जोड़ने की आवश्यकता थी। AJAX के अनुरोध को लॉगिन पृष्ठ (समाप्त हो चुके सत्र के कारण) पर पुनर्निर्देशित किए जाने के बाद से इसकी आवश्यकता थी, स्प्रिंग को पिछले AJAX अनुरोध और ऑटो रीडायरेक्ट को लॉगिन के बाद याद है। यह JSON ब्राउज़र पृष्ठ पर प्रदर्शित होने का कारण बनता है। बेशक, मुझे जो चाहिए वो नहीं।
Update2
उपयोग करने के बजाय always-use-default-target="true"
, अपेक्षित पोस्ट से AJAX अनुरोधों को अवरुद्ध करने के @RobWinch उदाहरण का उपयोग करें। यह सामान्य लिंक को लॉगिन के बाद अपने मूल लक्ष्य पर पुनर्निर्देशित करने की अनुमति देता है, लेकिन AJAX लॉगिन के बाद होम पेज पर जाता है।