আমি @John এবং @Arpad নিকট থেকে উত্তর ব্যবহার করে একটি কাজ solulion পেয়েছিলাম লিংক এবং @RobWinch লিংক
আমি স্প্রিং সিকিউরিটি 3.2.9 এবং jQuery 1.10.2 ব্যবহার করি।
শুধুমাত্র এজেএক্স অনুরোধগুলি থেকে 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");
}
}
});
এছাড়াও, জেএসপি পৃষ্ঠাগুলিতে এজেএক্স কলগুলি থেকে বিদ্যমান ত্রুটি হ্যান্ডলারগুলি সরিয়ে দিন:
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");
// }
});
আমি আশা করি এটি অন্যকে সহায়তা করে।
আপডেট 1
আমি খুঁজে পেয়েছি যে ফর্ম-লগইন কনফিগারেশনে আমার বিকল্পটি (সর্বদা-ব্যবহার-ডিফল্ট-টার্গেট = "সত্য") যুক্ত করা দরকার। একটি এজ্যাক্স অনুরোধটি লগইন পৃষ্ঠায় পুনর্নির্দেশ করার পরে (মেয়াদোত্তীর্ণ সেশনের কারণে) এটি প্রয়োজন ছিল, স্প্রিং পূর্ববর্তী এজেএক্স অনুরোধটিকে স্মরণ করে এবং লগইন করার পরে এটিতে স্বয়ংক্রিয়ভাবে পুনঃনির্দেশ করে। এর ফলে ফিরে আসা জেএসএন ব্রাউজার পৃষ্ঠায় প্রদর্শিত হয়। অবশ্যই, আমি যা চাই তা নয়।
Update2
ব্যবহার করার পরিবর্তে always-use-default-target="true"
, ব্যবহার @RobWinch requstCache থেকে AJAX অনুরোধ ব্লক উদাহরণ। এটি লগইন করার পরে সাধারণ লিঙ্কগুলিকে তাদের মূল টার্গেটে পুনঃনির্দেশের অনুমতি দেয় তবে এজেএক্স লগইন করার পরে হোম পৃষ্ঠায় যায়।