/ / इसके बिना संबंधित स्लैश के साथ URL को पुनर्निर्देशित कैसे करें? - जावा, वसंत, वसंत-पीवीसी, पुनर्निर्देशित, मॉडल-दृश्य-नियंत्रक

पीछे वाले स्लैश वाले यूआरएल को इसके बिना संबंधित लोगों को कैसे रीडायरेक्ट करें? - जावा, वसंत, वसंत-एमवीसी, रीडायरेक्ट, मॉडल-व्यू-कंट्रोलर

स्प्रिंग एमवीसी (3.0) एक ही URL के रूप में स्लैश के साथ और उसके बिना URL पर विचार करता है।

उदाहरण के लिए:

http://www.example.org/data/something = http://www.example.org/data/something/

मुझे पीछे चल रहे स्लैश के साथ URL को पुनर्निर्देशित करना होगा

http://www.example.org/data/something/

इसके बिना URL पर जाएं:

http://www.example.org/data/something

मुझे इसे आंतरिक रूप से करने की आवश्यकता है (इसलिए अपाचे, आदि के माध्यम से नियमों को फिर से लिखना नहीं)

इसे करने का एक तरीका है:

@ResponseStatus(value=HttpStatus.MOVED_PERMANENTLY)
@RequestMapping(value = "/data/something/")
public String dataSomethingRedirect(...) {
return "redirect:/data/something";
}

लेकिन इसमें आम तौर पर 2 समस्याएं हैं:

  1. बहुत सारे नियंत्रक
  2. मापदंडों के साथ समस्या: गलत एन्कोडिंग की तरह

सवाल

क्या सभी URL को इंटरसेप्ट करने का एक तरीका है और अगर उनके पास एक अनुगामी स्लैश है, तो उन्हें बिना किसी स्लैश के रिश्तेदार को पुनर्निर्देशित करें?

उत्तर:

उत्तर № 1 के लिए 13

आप अपने वेब कॉन्फ़िगरेशन में उन सभी पुनर्लेखन नियमों को सूचीबद्ध कर सकते हैं जिनकी आपको आवश्यकता है

यदि उनमें से कई नहीं हैं, तो आप इस तरह से अनुप्रेषित विचारों को कॉन्फ़िगर कर सकते हैं

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addRedirectViewController("/my/path/", "/my/path")
.setKeepQueryParams(true)
.setStatusCode(HttpStatus.PERMANENT_REDIRECT);
}

या आप एक प्रथा बना सकते हैं HandlerInterceptor

लेकिन इंटरसेप्टर एक विशिष्ट से मैप किए जाने से पहले होते हैं Controller.action और आपको उस संदर्भ में नियंत्रकों और कार्यों को जानने का कोई तरीका नहीं मिला।

आप सभी को HTTPServlet API और अनुरोध + प्रतिक्रिया मिल गई है; इसलिए आप ये कर सकते हैं:

response.sendRedirect("http://example.org/whitout-trailing-slash");

जवाब आप डॉन टी "पढ़ना चाहते हैं

यह व्यवहार (HTTP के बिना स्लैश = URL के साथ URL) HTTP पर विचार करते समय पूरी तरह "वैध" है। कम से कम यह स्प्रिंग के साथ डिफ़ॉल्ट व्यवहार है, जिसे आप अक्षम कर सकते हैं useTrailingSlashMatch (javadoc देखें)।

इसलिए फ्रंट-एंड सर्वर पर रीराइट / रीडायरेक्ट नियमों का उपयोग करने से समाधान हो सकता है; लेकिन फिर से, मुझे आपकी बाधाओं का पता नहीं है (हो सकता है कि आप इस बारे में विस्तार से बता सकें और हम अन्य समाधानों का पता लगा सकें।


जवाब के लिए 11 № 2

मुझे लगता है कि आप UrlRewriteFilter का उपयोग करके स्प्रिंग वेब के सर्वलेट में प्रवेश करने से पहले सबसे अच्छा विकल्प होगा, यह सुनिश्चित करेगा कि आपके रीडायरेक्ट नियम आपके नियंत्रकों को प्रभावित नहीं करेंगे।

कृपया ध्यान दें कि आप अपने .war प्रोजेक्ट में नियम लिखते हैं, mod_rewrite के साथ अपाचे में नहीं।

यहां जाओ googlecode पर लाइब्रेरी के प्रोजेक्ट के लिए।

urlrewrite.xml में लिखें:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 3.1//EN" "http://www.tuckey.org/res/dtds/urlrewrite3.1.dtd">
<urlrewrite>
<rule match-type="regex">
<note>Remove trailing slash</note>
<from>^(.*)/$</from>
<to type="redirect">$1</to>
</rule>
</urlrewrite>

अपने आवेदन के web.xml में, जोड़ें:

<filter>
<filter-name>UrlRewriteFilter</filter-name>
<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
<init-param>
<param-name>confPath</param-name>
<param-value>/WEB-INF/urlrewrite.xml</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>

खबरदार, web.xml में फिल्टर का घोषणा क्रम महत्वपूर्ण है, इसलिए वसंत से पहले कुछ भी इस एक को घोषित करने का प्रयास करें।

बेशक, यह है लेकिन UrlRewriteFilter क्या कर सकता है का एक अंश।

सादर।


जवाब के लिए 3 № 3

यह आमतौर पर स्प्रिंग में URLRewriteFilter के साथ मेरे लिए काम करता है।

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 3.2//EN"
"http://www.tuckey.org/res/dtds/urlrewrite3.2.dtd">
<urlrewrite>
<rule>
<note>Remove trailing slash for SEO purposes</note>
<from>/**/</from>
<to type="permanent-redirect">%{context-path}/$1</to>
</rule>
</urlrewrite>

जवाब के लिए 3 № 4

यकीन नहीं होता कि वसंत 3.0 में यह था, लेकिन वसंत 3.1 RequestMappingHandlerMapping आपको "useTrailingSlashMatch" संपत्ति सेट करने की अनुमति देता है। डिफ़ॉल्ट रूप से यह सच है।

मुझे लगता है कि इसे गलत पर स्विच करने से आपका समाधान हो जाएगामुद्दा, हालांकि यह आपके आवेदन भर में RequestMappingHandlerMapping द्वारा नियंत्रित सभी मैपिंग को प्रभावित करेगा ... ताकि आपके पास करने के लिए प्रतिगमन की उचित मात्रा हो।


जवाब के लिए 0 № 5

मैं @Brian क्लोजेल के साथ सहमत हूं: मुझे नहीं लगता कि आप जो चाहते हैं, वह करना एक अच्छा विचार है।

वैसे भी, मुझे लगता है कि सबसे सरल समाधान एक कस्टम लिखना है javax.servlet.Filter। तो, कोई वसंत निर्भरता नहीं। यदि अनुरोध URL स्लैश के साथ समाप्त होता है, तो आपको इसके बिना उसी url पर पुनर्निर्देशित करना होगा। लेकिन सावधानी:

  • सभी मापदंडों (GET और POST) को GET मापदंडों के रूप में जोड़ा जाना चाहिए। क्या आप सुनिश्चित हैं कि आपका आवेदन है विधि अज्ञेय?

  • आपको एन्कोडिंग के साथ कुछ समस्याएं हो सकती हैं। फ़िल्टर में आप आवश्यक एन्कोडिंग के लिए POST मापदंडों को एनकोड कर सकते हैं। लेकिन GET मापदंडों के लिए डिफ़ॉल्ट एन्कोडिंग आपके एप्लिकेशन में कॉन्फ़िगर नहीं की गई है। Server.xml (यदि टॉमकैट) में कॉन्फ़िगर किया गया है और डिफ़ॉल्ट मान ISO-8859-1 है।

सौभाग्य!


जवाब के लिए 0 № 6

SEO के आधार पर, मुझे लगता है कि अंतर करना महत्वपूर्ण है।

यदि URL जो अनुगामी स्लैश में समाप्त हो गया हैमौजूद है, खोज इंजन में अनुक्रमित है और इंटरनेट पर लिंक हैं, उद्धव कांबली के अनुसार एक स्थायी पुनर्निर्देशन (301) की आवश्यकता है। मानक पुनर्निर्देशन (302) डुप्लिकेट किए गए URL होने से बेहतर होगा, लेकिन यह पर्याप्त अच्छा नहीं है।

हालाँकि, यदि URL कभी अस्तित्व में नहीं है, तो यह इंटरनेट पर अनुक्रमित नहीं है और कोई बाहरी लिंक नहीं हैं, URL मौजूद नहीं है। इसलिए 404, पृष्ठ नहीं मिला, एक बेहतर फिट है।

वेब-INF / urlrewrite.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 3.1//EN"  "http://www.tuckey.org/res/dtds/urlrewrite3.1.dtd">
<urlrewrite>
<rule match-type="regex">
<note>Remove trailing slash</note>
<from>^(.+)/$</from>
<set type="status">404</set>
<to>null</to>
</rule>
</urlrewrite>

और विन्यास को पूरा करने के लिए ...

WEB-INF / web.xml में जोड़ें

<filter>
<filter-name>UrlRewriteFilter</filter-name>
<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
<init-param>
<param-name>confPath</param-name>
<param-value>/WEB-INF/urlrewrite.xml</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>

Maven

<dependency>
<groupId>org.tuckey</groupId>
<artifactId>urlrewritefilter</artifactId>
<version>4.0.3</version>
</dependency>

उत्तर के लिए 0 № 7

मैंने पाया है कि यह केवल आपके @Conigigitation में एक ErrorViewResolver सेम का उपयोग करके बहुत अधिक नियंत्रित किया जा सकता है:

@Autowired
private DefaultErrorViewResolver defaultErrorViewResolver;

@Bean
ErrorViewResolver errorViewResolver() {
return new ErrorViewResolver() {
@Override
public ModelAndView resolveErrorView(HttpServletRequest request, HttpStatus status, Map<String, Object> model) {
if(model.containsKey("path") && !model.get("path").toString().endsWith("/")) {
return new ModelAndView("redirect:"+model.get("path") + "/");
}
return defaultErrorViewResolver.resolveErrorView(request, status, model);
}
};
}

मुझे यकीन नहीं है कि यह अच्छा या बुरा अभ्यास है, लेकिनयह मेरी परिस्थिति में प्रभावी है, और बिल्कुल वही करता है जो मुझे एक मनमाना पथ "फू" के लिए करने की आवश्यकता है: एक 302 रीडायरेक्ट के साथ प्रतिक्रिया करें / / foo / जब आप अनुरोध / फू और जवाब दें जब आपको अनुरोध / फू करना चाहिए