我想创建一个抽象 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/