मैं चाहता हूं कि मेरे नियंत्रक को सही HTTP प्रतिक्रिया कोड वापस कर दें जब उपयोगकर्ता को किसी विशेष पृष्ठ को देखने की अनुमति न हो।मैं वसंत एमवीसी में 403 निषिद्ध कैसे लौटा सकता हूं?
उत्तर
ढिलाई
आप सादे JSP विचारों उपयोग कर रहे हैं (के रूप में सबसे आम है), तो बस अपने दृश्य फ़ाइल में
<% response.setStatus(403); %>
कहीं जोड़ें। शीर्ष पर एक अच्छी जगह है।
विस्तार
MVC में, मैं हमेशा इस दृश्य में सेट है, और वसंत-MVC के साथ ज्यादातर मामलों में, SimpleMappingExceptionResolver
का उपयोग सही दृश्य पेश करने के लिए एक फेंक दिया क्रम अपवाद के जवाब में।
उदाहरण के लिए: अपने नियंत्रक या सेवा परत में PermissionDeniedException
बनाएं और फेंक दें और अपवाद रिज़ॉल्वर को एक दृश्य फ़ाइल permissionDenied.jsp
पर इंगित करें। यह दृश्य फ़ाइल 403 स्थिति सेट करती है और उपयोगकर्ता को एक उचित संदेश दिखाती है।
अपने वसंत सेम एक्सएमएल फ़ाइल में:
<bean id="exceptionResolver"
class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="PermissionDeniedException">
rescues/permissionDenied
</prop>
... set other exception/view mappings as <prop>s here ...
</props>
</property>
<property name="defaultErrorView" value="rescues/general" />
</bean>
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
आप एक उपयोगकर्ता लॉगिन तंत्र लागू करने के लिए, Spring Security (पूर्व Acegi सुरक्षा) पर एक नज़र डालें की जरूरत है।
ExceptionResolver
का उपयोग करने का एक शानदार तरीका है, लेकिन यदि आप इसे केवल स्वतंत्र-स्वतंत्र होना चाहते हैं, तो आप निश्चित रूप से अपने नियंत्रक में response.sendError(HttpServletResponse.SC_FORBIDDEN, "AdditionalInformationIfAvailable");
पर कॉल कर सकते हैं।
@ResponseStatus के साथ एनोटेटेड अपवाद बनाएं उदा। इस तरह:
@ResponseStatus(HttpStatus.FORBIDDEN)
public class ForbiddenException extends RuntimeException {
}
अब बस अपने हैंडलर विधि में है कि अपवाद फेंक और प्रतिसाद स्थिति 403
होगा आप, साथ ही फेंक कर सकते हैं
org.springframework.security.access.AccessDeniedException("403 returned");
इस जवाब में एक 403 देता है हैडर।
यह पूरी तरह से काम करता है और होना चाहिए स्वीकृत उत्तर क्योंकि यह सबसे लचीला है। – Heady
@ हेडी: वास्तव में सबसे अच्छा जवाब नहीं है क्योंकि यह वसंत सुरक्षा के साथ एक मजबूत निर्भरता बनाता है। जो का जवाब, अपना खुद का अपवाद बनाने के लिए, सबसे अच्छा आईएमओ है। मैंने अभी भी उसको उखाड़ फेंक दिया क्योंकि यह एक सभ्य विकल्प है। –
यह मेरे लिए 500 लौटाता है। – heez
प्रतिक्रिया.सेटस्टैटस क्यों आवश्यक है? प्रतिक्रिया के बाद (टॉमकैट में), प्रतिक्रिया के http प्रतिक्रिया कोड का कुछ चरण विकास हुआ प्रतीत होता है - यह पहला 200 (डिफ़ॉल्ट) है, फिर वसंत डिस्पैचर सर्वलेट प्रक्रिया करते समय 404 (तर्क के लिए) की ओर जाता है हैंडलर अपवाद, फिर, दृश्य प्रस्तुत किया जाता है और कोड 500 पर सेट किया जाता है (जो अजीब है), और उसके बाद, सेटस्टैटस वास्तव में प्रतिक्रिया के कोड को 404 पर वापस कर समस्या को ठीक करता है। – Eugen