2

プロジェクトで spring mvc3 を使用していますが、リクエスト マッピング パターン (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" を取得する場合はメソッドを実行できませんhttp://localhsot/app/posts/3/edit/

次のようにリクエスト マッピング値を設定できることはわかっています。

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

しかし、他の解決策があるのだろうか?Rails は URL の最後のスラッシュを無視するようです。

アップデート:

サーブレット-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>
4

1 に答える 1

4

あなたは間違った問題を解決しようとしていると思います。

末尾にスラッシュがある場合とない場合の両方の URL を一致させると、コンテンツが重複しているため、検索エンジンからの評価が低くなります。

私がすることは、ステータスコードを使用して、末尾にスラッシュを付けずにすべてのリクエストを送信するフィルターを追加し、末尾にスラッシュを付けてリダイレクトする (またはその逆) ことです。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() { }
}
于 2012-08-29T09:02:47.243 に答える