Spring Boot:注入自定义上下文路径

本杰明·M

我正在运行带有嵌入式Tomcat的Spring Boot 1.2.3应用程序。

我想根据URL的第一部分在每个请求上注入一个自定义的contextPath。

例子:

  1. http://localhost:8080/foo有默认情况下contextPath="",应该得到contextPath="foo"

  2. http://localhost:8080/foo/bar有默认情况下contextPath="",应该得到contextPath="foo"

(没有路径的网址应保持原样)

我试着写一个定制的javax.servlet.Filter@Order(Ordered.HIGHEST_PRECEDENCE),但好像我失去了一些东西。这是代码:

@Component @Order(Ordered.HIGHEST_PRECEDENCE)
public class MultiTenancyFilter implements Filter {
    private final static Pattern pattern = Pattern.compile("^/(?<contextpath>[^/]+).*$");

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        final HttpServletRequest req = (HttpServletRequest) request;
        final String requestURI = req.getRequestURI();

        Matcher matcher = pattern.matcher(requestURI);
        if(matcher.matches()) {
            chain.doFilter(new HttpServletRequestWrapper(req) {
                @Override
                public String getContextPath() {
                    return "/"+matcher.group("contextpath");
                }
            }, response);
        }
    }

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

这应该只是在第一个字符串之后/和第二个字符串之前(如果有)之前获取String /,然后将其用作返回值getContextPath()


但是Spring @Controller @RequestMapping和Spring SecurityantMatchers("/")似乎并不尊重它。两者仍然像工作contextPath=""


如何动态覆盖每个请求的上下文路径?

本杰明·M

得到它的工作!

Spring Security文档(http://docs.spring.io/spring-security/site/docs/3.1.x/reference/security-filter-chain.html)说:“ Spring Security只对保护应用程序中的路径感兴趣daccess-ods.un.org daccess-ods.un.org daccess-ods.un.org daccess_ods.un.org模式与连接的ServletPath和pathInfo的大小写不区分大小写的匹配,忽略了queryString。”

所以我只是重写了servletPathand contextPath(即使Spring Security不使用它)。另外,我添加了一些小的重定向,因为通常在http://localhost:8080/myContext点击时会被重定向到,http://localhost:8080/myContext/而Spring Securities Ant Matcher不喜欢缺少的斜杠。

所以这是我的MultiTenancyFilter代码:

@Component @Order(Ordered.HIGHEST_PRECEDENCE)
public class MultiTenancyFilter extends OncePerRequestFilter {
    private final static Pattern pattern = Pattern.compile("^(?<contextPath>/[^/]+)(?<servletPath>.*)$");

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        Matcher matcher = pattern.matcher(request.getServletPath());
        if(matcher.matches()) {
            final String contextPath = matcher.group("contextPath");
            final String servletPath = matcher.group("servletPath");

            if(servletPath.trim().isEmpty()) {
                response.sendRedirect(contextPath+"/");
                return;
            }

            filterChain.doFilter(new HttpServletRequestWrapper(request) {
                @Override
                public String getContextPath() {
                    return contextPath;
                }
                @Override
                public String getServletPath() {
                    return servletPath;
                }
            }, response);
        } else {
            filterChain.doFilter(request, response);
        }
    }

    @Override
    protected String getAlreadyFilteredAttributeName() {
        return "multiTenancyFilter" + OncePerRequestFilter.ALREADY_FILTERED_SUFFIX;
    }
}

它仅使用此处提到的URL模式提取contextPath和servletPath:https ://theholyjava.wordpress.com/2014/03/24/httpservletrequest-requesturirequesturlcontextpathservletpathpathinfoquerystring/

另外,我必须提供一个自定义getAlreadyFilteredAttributeName方法,因为否则过滤器将被调用两次。(这导致contextPath两次剥离

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Spring Boot中何时使用自定义上下文路径而不是根上下文

来自分类Dev

Spring Boot和上下文路径

来自分类Dev

在Spring上下文中查找方法级别的自定义注释

来自分类Dev

Undertow和Tomcat的Spring Boot .war上下文路径

来自分类Dev

具有上下文路径的Spring Boot静态内容

来自分类Dev

Undertow和Tomcat的Spring Boot .war上下文路径

来自分类Dev

Spring REST模拟上下文路径

来自分类Dev

带测试容器和jOOQ的Spring Boot不会注入DSL上下文

来自分类Dev

自定义属性无法在 Spring Boot 中注入

来自分类Dev

如何在Spring Boot jboss / wildfly中设置上下文路径?

来自分类Dev

将自定义服务注入Behat上下文

来自分类Dev

带有Spring和自定义上下文文件的Apache CXF中未生成WS-Security Policy节点

来自分类Dev

如何在Spring上下文中注入模拟

来自分类Dev

依赖注入到Spring Servlet上下文(OncePerRequestFilter)

来自分类Dev

Spring Webjars定位器和上下文路径

来自分类Dev

Spring应用程序中的根上下文路径

来自分类Dev

Spring MVC + Thymeleaf-正确的上下文路径处理

来自分类Dev

Spring Boot和Jboss wildfly设置上下文根

来自分类Dev

Spring Boot外部配置和xml上下文

来自分类Dev

Spring Boot动态上下文创建(父/子)

来自分类Dev

Spring Boot需要上下文根目录的授权

来自分类Dev

Spring Boot 中的上下文初始化问题

来自分类Dev

从Spring Boot 1.5.9升级到2.2.6时,HATEOAS链接中未考虑上下文路径

来自分类Dev

Spring XML 定义的上下文不能做什么?

来自分类Dev

spring-boot属性注入在自定义@Configuration类中不起作用

来自分类Dev

将数据库上下文注入自定义属性.NET Core

来自分类Dev

Spring Boot自定义登录页面

来自分类Dev

Spring boot 禁用自定义 HealthIndicator

来自分类Dev

Spring Security:如何设置一个与上下文路径不同的RememberMe cookie url路径?

Related 相关文章

  1. 1

    在Spring Boot中何时使用自定义上下文路径而不是根上下文

  2. 2

    Spring Boot和上下文路径

  3. 3

    在Spring上下文中查找方法级别的自定义注释

  4. 4

    Undertow和Tomcat的Spring Boot .war上下文路径

  5. 5

    具有上下文路径的Spring Boot静态内容

  6. 6

    Undertow和Tomcat的Spring Boot .war上下文路径

  7. 7

    Spring REST模拟上下文路径

  8. 8

    带测试容器和jOOQ的Spring Boot不会注入DSL上下文

  9. 9

    自定义属性无法在 Spring Boot 中注入

  10. 10

    如何在Spring Boot jboss / wildfly中设置上下文路径?

  11. 11

    将自定义服务注入Behat上下文

  12. 12

    带有Spring和自定义上下文文件的Apache CXF中未生成WS-Security Policy节点

  13. 13

    如何在Spring上下文中注入模拟

  14. 14

    依赖注入到Spring Servlet上下文(OncePerRequestFilter)

  15. 15

    Spring Webjars定位器和上下文路径

  16. 16

    Spring应用程序中的根上下文路径

  17. 17

    Spring MVC + Thymeleaf-正确的上下文路径处理

  18. 18

    Spring Boot和Jboss wildfly设置上下文根

  19. 19

    Spring Boot外部配置和xml上下文

  20. 20

    Spring Boot动态上下文创建(父/子)

  21. 21

    Spring Boot需要上下文根目录的授权

  22. 22

    Spring Boot 中的上下文初始化问题

  23. 23

    从Spring Boot 1.5.9升级到2.2.6时,HATEOAS链接中未考虑上下文路径

  24. 24

    Spring XML 定义的上下文不能做什么?

  25. 25

    spring-boot属性注入在自定义@Configuration类中不起作用

  26. 26

    将数据库上下文注入自定义属性.NET Core

  27. 27

    Spring Boot自定义登录页面

  28. 28

    Spring boot 禁用自定义 HealthIndicator

  29. 29

    Spring Security:如何设置一个与上下文路径不同的RememberMe cookie url路径?

热门标签

归档