【问题标题】:dispatcher servlet not finding url rewritten in filter调度程序 servlet 找不到在过滤器中重写的 url
【发布时间】:2009-12-29 00:01:13
【问题描述】:

我有带注释控制器的 Spring 3.0 设置,当我从浏览器向它发送 url 时,它正在查找我的控制器并执行它。但是,当使用过滤器将 url 重写为在浏览器中工作的完全相同时,我得到No mapping found for HTTP request with URI [/test/lookup]。过滤器由 org.springframework.web.filter.DelegatingFilterProxy 加载。

我在过滤器中遗漏了什么?

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import org.springframework.stereotype.Component;


@Component("urlLookupFilter")
public class UrlLookupFilter implements Filter {

    private class ModifiedRequest extends HttpServletRequestWrapper {

        private String mRequestURI;
        private String mQueryString;

        public ModifiedRequest(HttpServletRequest request) {
            super(request);
        }

        @Override
        public String getRequestURI() {
            return mRequestURI;
        }

        public void setRequestUri(String s) {
            this.mRequestURI = s;
        }

        @Override
        public String getQueryString() {
            return mQueryString;
        }

        public void setQueryString(String s) {
            this.mQueryString = s;
        }
    }

    public void init(FilterConfig filterConfig) throws ServletException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest oRequest = (HttpServletRequest) request;

        if (oRequest.getRequestURI().endsWith("test")) {
            ModifiedRequest mRequest = new ModifiedRequest(oRequest);
            mRequest.setRequestUri(oRequest.getContextPath() + "/lookup");
            mRequest.setQueryString(oRequest.getRequestURI().substring(oRequest.getContextPath().length()));
            chain.doFilter(mRequest, response);
            return;
        }
        chain.doFilter(request, response);
    }

    public void destroy() {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}

【问题讨论】:

    标签: java spring spring-mvc


    【解决方案1】:

    正如我在回复您的previous question 时提到的,仅覆盖getRequestURI 是不够的,您需要在请求中覆盖几个不同的路径相关方法,例如getPathInfogetServletContextPath等等。这确实不是一个好主意,但如果你真的想这样做,你必须通过 Spring 源代码,找到请求中的哪些方法用于进行映射,并确保你'覆盖那个。

    【讨论】:

    • 谢谢。我同意这样一个事实,那就是这真的不是一个好主意。如果将来有人和我有同样的好主意,那就不要这样做! ;)
    猜你喜欢
    • 2013-03-16
    • 2011-07-25
    • 2012-07-24
    • 2014-12-10
    • 2016-09-23
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多