2012-08-29 2 views
2

내 프로젝트에 스프링 mvc3를 사용하고, 내가 요청 매핑 패턴 (URL의 마지막 슬래시)요청 매핑 URL 패턴

예를 들어 다음과 같이 컨트롤러의 방법을 가지고와 혼란 스러워요 :

@RequestMapping(value = "/{id}/edit", method = RequestMethod.GET) 
public String edit(@PathVariable int id, Model model) { 
    model.addAttribute(postDao.query(id)); 
    return "posts/edit"; 
} 

URL이 ""일 때 작동하지만, URL이 "http://localhsot/app/posts/3/edit/"이면 방법을 사용할 수 없습니다.

는 나는이 같은 요청 매핑 값을 설정할 수 있습니다 알고

@RequestMapping(value = {"/{id}/edit","/{id}/edit/"}) 

을하지만 다른 해결책이 궁금해? 레일이 URL의 마지막 슬래시를 무시하는 것 같습니다.

UPDATE :

서블릿의 context.xml :

<mvc:annotation-driven /> 
<mvc:view-controller path="/" view-name="home" /> 
<context:component-scan base-package="com.king.controller" /> 
<mvc:resources mapping="/res/**" location="/res/" /> 
<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver"> 
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> 
    <property name="prefix" value="/WEB-INF/jsp/" /> 
    <property name="suffix" value=".jsp" /> 
</bean> 

web.xml을

<filter> 
    <filter-name>httpMethodFilter</filter-name> 
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>httpMethodFilter</filter-name> 
    <servlet-name>modelServlet</servlet-name> 
</filter-mapping> 
<servlet> 
    <servlet-name>modelServlet</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/spring/servlet-context.xml</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>modelServlet</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 
+0

나는 봄 mvc3을 사용하고 있으며 URL의 끝에 "/"가있을 때 동일한 매핑 방법을 사용하고 있습니다. 나는 이것을 성취하기 위해 특별한 것을 사용하는 것을 기억하지 않는다. 어떤 서버를 사용하고 있습니까? web.xml 파일을 게시 할 수 있습니까? – jelies

답변

4

난 당신이 잘못된 문제를 해결하기 위해 노력하고있다 생각합니다.

URL에 후행 슬래시가 있거나없는 경우 모두 일치하면 duplicate content으로 인해 검색 엔진에서 나쁜 평점을 얻게됩니다. 내가 할 것이 무엇

는 필터의 최소한의 구현은 여기에 상태 코드 HttpServletResponse.SC_MOVED_PERMANENTLY

를 사용하여 슬래시 (또는 그 반대) 후행 리디렉션을 슬래시 후행하지 않고 모든 요청을 전송하는 필터를 추가하는 것입니다

public class CanonicalUrlFilter implements Filter { 
    @Override 
    public void init(final FilterConfig filterConfig) throws ServletException { } 

    @Override 
    public void doFilter(final ServletRequest servletRequest, final ServletResponse servletResponse, 
      final FilterChain filterChain) throws IOException, ServletException { 
     if (servletRequest instanceof HttpServletRequest) { 
      HttpServletRequest hsr = (HttpServletRequest) servletRequest; 
      if (hsr.getMethod().equals("GET") && !hsr.getRequestURI().endsWith("/") && (hsr.getQueryString() == null)) { 
       HttpServletResponse response = (HttpServletResponse) servletResponse; 
       response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY); 
       response.sendRedirect(hsr.getRequestURI() + "/"); 
       return; 
      } 
     } 

     filterChain.doFilter(servletRequest, servletResponse); 
    } 

    @Override 
    public void destroy() { } 
} 
+0

답장과 좋은 코드에 감사드립니다. 그러나 이것은 리디렉션이 다른 요청이기 때문에 이것이 성능 문제를 일으키는 지 궁금합니다. – hguser

+0

오버 헤드가 최소화되면 사용중인 모든 사이트에서 항상 리디렉션됩니다. 그러나 그것은 물론 있습니다. –

+0

이 문제는 post 메소드에도 존재합니다. – hguser