@ ජෝන් සහ r ආර්පාඩ් සබැඳිය සහ ob රොබ් වින්ච් සබැඳියෙන් පිළිතුරු භාවිතා කරමින් මට වැඩ කිරීමේ විසඳුමක් ලැබුණි.
මම වසන්ත ආරක්ෂාව 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>
මගේ JSPs හි, මෙහි පෙන්වා ඇති පරිදි ගෝලීය 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");
}
}
});
එසේම, ජේඑස්පී පිටුවල ඇති 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
මට ආකෘති-පිවිසුම් වින්යාසයට විකල්පය ( සැමවිටම- use-default-target = "true") එක් කිරීමට අවශ්ය බව මට පෙනී ගියේය. මෙය අවශ්ය වූයේ AJAX ඉල්ලීමක් පිවිසුම් පිටුවට හරවා යැවීමෙන් පසුව (කල් ඉකුත් වූ සැසිය නිසා), වසන්තය පෙර AJAX ඉල්ලීම සිහිපත් කරන අතර පිවිසීමෙන් පසු ස්වයංක්රීයව එය වෙත හරවා යවයි. මෙය ආපසු ලබා දුන් JSON බ්රව්සර් පිටුවේ දර්ශනය වීමට හේතු වේ. ඇත්ත වශයෙන්ම, මට අවශ්ය දේ නොවේ.
Update2
භාවිතා කිරීම වෙනුවට always-use-default-target="true"
, requstCache වෙතින් AJAX ඉල්ලීම් අවහිර කිරීම පිළිබඳ @RobWinch උදාහරණය භාවිතා කරන්න. පුරනය වීමෙන් පසු සාමාන්ය සබැඳි ඒවායේ මුල් ඉලක්කය වෙත හරවා යැවීමට මෙය ඉඩ දෙයි, නමුත් AJAX පිවිසීමෙන් පසු මුල් පිටුවට යන්න.