java - 拦截 Controller 请求的问题

标签 java spring spring-mvc controller

我想创建一个抽象 Controller ,它将根据扩展 Controller 的实际映射添加额外的请求映射。

例如,对于以下 Controller

@Controller
public class MyController extends VariableResolvingController {
    @RequestMapping("page.htm") 
    public void handlerMethod() {
    }
}

我希望它扩展 VariableResolvingController,它将使用“page.htm.context”URI 添加到其 resolveContextVariable(...) 方法的映射。

public abstract class VariableResolvingController {
    public final @ResponseBody Object resolveContextVariable(String variableName) {
        return "{}";
    }

    protected final void registerVariableResolver(String variableName, VariableResolver resolver) {
        //...
    }
}

这种方法增加了使用例如解析自定义变量的可能性。 AJAX 请求的方式对于客户端代码来说几乎是透明的。

您知道适合这种情况的现有解决方案吗?

解决方案:我通过编写自定义 HandlerMapping 实现了我的目标实现(本质上是 RequestMappingHandlerMapping 的装饰器)。

最佳答案

一种方法是将简单的 Servlet 过滤器添加到您的 spring mvc

 public class RequestCheckFilter implements Filter {

        @Override
        public void destroy() {
            // ...
        }

        @Override
        public void init(FilterConfig filterConfig) throws ServletException         {
            //
        }

        @Override
        public void doFilter(ServletRequest request,
                   ServletResponse response, FilterChain chain)
            throws IOException, ServletException {

            try {
                HttpServletRequest httpServletRequest = ((HttpServletRequest) request);
            String requestURI = httpServletRequest.getRequestURI();

            if (requestURI.endsWith(".context")) {
                request.getRequestDispatcher(requestURI.concat(".htm"))
                    .forward(request,response);
            } else {
                chain.doFilter(httpServletRequest, response);
            }
       } catch (Exception ex) {
            request.setAttribute("errorMessage", ex);
            request.getRequestDispatcher("/WEB-INF/views/jsp/error.jsp")
                           .forward(request, response);
       }

}

添加

public class MyWebInitializer extends
        AbstractAnnotationConfigDispatcherServletInitializer {

    //...

    @Override
    protected Filter[] getServletFilters() {
        return new Filter[]{new RequestCheckFilter()};
    }
}

或在 web.xml 中

<filter>
    <filter-name>reqHandlerFilter</filter-name>
    <filter-class>RequestCheckFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>reqHandlerFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

关于java - 拦截 Controller 请求的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40378645/

相关文章:

java - 如何在 Java 上验证构造函数参数?

java - Spring-Security:使用自定义身份 validator 和自定义登录页面

java - WebSockets 请求中请求的资源上不存在 'Access-Control-Allow-Origin' header

java - 如何使用 Spring MVC 和 hibernate 连接/绑定(bind)两个表

java - 如何在 5 秒延迟后自动单击 Android 中的按钮

java - IBM Domino 设计器

java - 如何在 spring 中配置基于语言环境的日期格式支持

java - 多线程(多请求)调用的Spring @Transactional方法

java - Spring MVC 中的 Controller 和 Handler 有什么区别?

java - 在 Java 中使用类型推断和泛型方法