2012-07-24 8 views
8

बिना मैं वसंत MVC का उपयोग कर रहा सेट करने के लिए कैसे और सफलतापूर्वक सेट एक WebApplicationInitializer (बिलाव के ServletContainerInitializer का उपयोग कर), किसी भी web.xml फ़ाइल के बिना। (डिस्पैचर की तरह) (स्प्रिंग सुरक्षा की तरह) फिल्टर और सर्वलेट जोड़ा जा रहा है कोई समस्या नहीं है, और वे ठीक काम करते हैं। अगर मुझे ऐसा करने की ज़रूरत है तो मैं इनिट-पैराम्स भी सेट कर सकता हूं।सत्र-टाइमआउट त्रुटि पृष्ठों को प्रोग्राम के web.xml

क्या मैं समझ नहीं कैसे विशेष टैग कि सामान्य रूप से web.xml में मौजूद के कुछ स्थापित करने के लिए है। उदाहरण के लिए, मैं एक कस्टम 403 त्रुटि पृष्ठ स्थापित करना चाहता हूं। आम तौर पर मैं साथ web.xml में यह करना होगा:

<error-page> 
    <error-code>403</error-code> 
    <location>/accessDenied.html</location> 
</error-page> 

लेकिन मैं कैसे WebApplicationInitializer (जो ServletContext पहुंच सकता है) के अंदर यह करने के लिए पता नहीं कर सकते हैं।

मैं सत्र-समय समाप्ति और स्वागत-फाइलों के साथ एक ही समस्या है। मैं लगभग दो दिनों की खोज कर रहा हूं, लेकिन अभी भी इसे प्रोग्रामेटिक रूप से नहीं देखा है। फिर लक्ष्य वेब.एक्सएमएल फ़ाइल को पूरी तरह से निकालना है और इसके बजाय प्रारंभकर्ता वर्ग का उपयोग करना है।

कोई भी विचार?

उत्तर

7

की तरह इस WebApplicationInitializer माध्यम से संभव है प्रतीत नहीं होता है, तो आप कुछ अन्य लोगों के इस सवाल के साथ सूचीबद्ध के साथ विशेष रूप से इस विन्यास के लिए web.xml पर कायम करना होगा - Using Spring MVC 3.1+ WebApplicationInitializer to programmatically configure session-config and error-page

+0

धन्यवाद: एर इस पंक्ति जोड़ें। यही कारण है कि मामले में, अपने जवाब में लिंक के आधार पर प्रतीत होता है। ओह। – BobRob

+0

[इस के लिए सर्वलेट कल्पना मुद्दा] (https://java.net/jira/browse/SERVLET_SPEC-50) –

2
StandardEngine standardEngine = (StandardEngine)MBeanServerFactory.findMBeanServer(null).get(0).getAttribute(new ObjectName("Catalina", "type", "Engine"), "managedResource"); 

// This is totally irresponsible and will only work if this webapp is running on the default host 
StandardContext standardContext = (StandardContext)standardEngine.findChild(standardEngine.getDefaultHost()).findChild(servletContext.getContextPath()); 

ErrorPage errorPage404 = new ErrorPage(); 
errorPage404.setErrorCode(404); 
errorPage404.setLocation("/404"); 
standardContext.addErrorPage(errorPage404); 
+0

आदमी यह बहुत अच्छा काम किया – kakabali

0

पेज त्रुटि के लिए, इस जवाब देखें: How to make a filter to detect if the user requested a page that is not found?

  1. एक फ़िल्टर
  2. उपयोग HttpServletResponseWrapper और ओवरराइड बनाओ sendError() और setStatus()
  3. अपने आवरण में आप एक sendError() मिलता है chain.doFilter (अनुरोध, आवरण)
  4. के माध्यम से लिपटे प्रतिक्रिया दर्रा, देखें कि क्या वह एक 404.
  5. उचित प्रतिक्रिया लो है ।
1

आप इस तरह somethink उपयोग कर सकते हैं:

@WebFilter(filterName = "ErrorPageFilter", urlPatterns = "/*") 
public class ErrorPageFilter extends BaseHttpFilter { 

private GlobalErrorHandler globalErrorHandler; 

@Override 
public void init(FilterConfig filterConfig) throws ServletException { 
    globalErrorHandler = BeansUtil.getBean(filterConfig.getServletContext(), GlobalErrorHandler.class); 
} 

@Override 
protected void doHttpFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { 
    chain.doFilter(request, new ErrorPageHttpServletResponseWrapper(request, response)); 
} 

private class ErrorPageHttpServletResponseWrapper extends HttpServletResponseWrapper { 
    HttpServletRequest request; 

    public ErrorPageHttpServletResponseWrapper(HttpServletRequest request, HttpServletResponse response) { 
     super(response); 
     this.request = request; 
    } 

    @Override 
    public void sendError(int sc) throws IOException { 
     globalErrorHandler.handleError(sc, request, this); 
    } 

    @Override 
    public void sendError(int sc, String msg) throws IOException { 
     sendError(sc); 
    } 
} 
} 

public interface GlobalErrorHandler { 

void handleError(int responseCode, HttpServletRequest request, HttpServletResponse httpServletRequest) throws IOException; 

void addHandler(int responseCode, String handlerDescription); 
} 
+0

यह एक वास्तव में इस मुद्दे का हल तरह दिखता है। –

0

अपने WebApplicationInitializer की ServletContext में जोड़ने आप अपनी खुद की SessionListener बनाने की कोशिश करनी चाहिए और फिर ..

कुछ इस तरह:

import javax.servlet.http.HttpSessionEvent; 
import javax.servlet.http.HttpSessionListener; 

public class SessionListener implements HttpSessionListener { 

    public void sessionCreated(HttpSessionEvent evt) { 
     System.out.println("Session created"); 
     evt.getSession().setMaxInactiveInterval(30 * 60); // That means 30 minutes. 
    } 

    public void sessionDestroyed(HttpSessionEvent evt) { 
     System.out.println("Session destroyed"); 
    } 
} 

और फिर अपने WebContentInitializ में

servletContext.addListener(new SessionListener()); 
संबंधित मुद्दे