spring - spring mvc3 中的请求映射 url 模式

标签 spring spring-mvc

我在项目中使用 spring mvc3,我对请求映射模式(url 中的最后一个斜杠)感到困惑

以下面的 Controller 方法为例:

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

当获取url“http://localhsot/app/posts/3/edit”时它可以工作,但是如果获取url“http://”则无法使用该方法localhsot/app/posts/3/edit/”。

我知道我可以像这样设置请求映射值:

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

但我想知道是否还有其他解决方案? Rails 似乎会忽略 url 中的最后一个斜杠。

更新:

servlet-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>

最佳答案

我认为您正在尝试解决错误的问题。

如果您匹配带有或不带有尾部斜杠的网址,您将因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() { }
}

关于spring - spring mvc3 中的请求映射 url 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12173854/

相关文章:

java - JOOQ - 列 "id"是 uuid 类型,但表达式是字符类型变化

java - Autowiring 失败 : Not an managed Type

java - Spring Boot 中的 RestController 中未找到 404

java - 手动将 Spring MVC 项目导入 Eclipse

java - 如何使用 Jackson 反序列化 2D 数组

java - Spring Webflux 或非阻塞模式不能不利于扩展

java - 如何将 Spring URL 映射到/WEB-INF/views 中的 JSP 文件?

java - 来自多个来源的 Spring MVC 复杂模型填充

java - Spring 4运行调度任务两次,没有applicationContext.xml

java - 在 WebSphere 下使用 Log4j 从 Spring 进行日志记录