如何从URL,SpringBoot和AngularJs应用程序中删除#?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (108)

这是我的TuckeyRewriteFilter过滤器类

public class TuckeyRewriteFilter extends org.tuckey.web.filters.urlrewrite.UrlRewriteFilter {

    @Override
    protected void loadUrlRewriter(FilterConfig filterConfig) throws ServletException {
        String confPath = filterConfig.getInitParameter("confPath");
        ServletContext context = filterConfig.getServletContext();
        try {
            final URL confUrl = getClass().getClassLoader().getResource(confPath);
            final InputStream config = getClass().getClassLoader().getResourceAsStream(confPath);
            Conf conf = new Conf(context, config, confPath, confUrl.toString(), false);
            checkConf(conf);
        } catch (Throwable e) {
            throw new ServletException(e);
        }
    }

}

这是我的springboot主类

public class AdminWebApplication {

    public static final String REWRITE_FILTER_NAME = "rewriteFilter";
    public static final String REWRITE_FILTER_CONF_PATH = "urlrewrite.xml";

    @Autowired
    ApplicationContext applicationContext;

    public static void main(String[] args) {
        SpringApplication.run(AdminWebApplication.class, args);
    }

    @Bean
    public ObjectMapper createObjectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        applicationContext.getAutowireCapableBeanFactory().autowireBean(objectMapper);
        return objectMapper;
    }

    @Bean
    public FilterRegistrationBean rewriteFilterConfig() {
        FilterRegistrationBean reg = new FilterRegistrationBean();
        reg.setName(REWRITE_FILTER_NAME);
        reg.setFilter(new TuckeyRewriteFilter());
        reg.addInitParameter("confPath", REWRITE_FILTER_CONF_PATH);
        reg.addInitParameter("confReloadCheckInterval", "-1");
        reg.addInitParameter("statusPath", "/redirect");
        reg.addInitParameter("statusEnabledOnHosts", "*");
        reg.addInitParameter("logLevel", "WARN");
        return reg;
    }
}

这是我的urlrewrite.xml 这个文件是从资源文件夹配置工作正常,加载登录页面,但我还是要通过/ #login,然后它重定向到/ login URL,但是在浏览器刷新我得到404错误。index.html,我已添加,我的端口ID后不想要额外的域名。

<urlrewrite default-match-type="wildcard">
    <rule>
        <from>/login</from>
        <to>/login.html</to>//As of now only configured for login page.
    </rule>
    <rule>
        <from>/contact</from>
        <to>/index.html</to>
    </rule>
</urlrewrite>
提问于
用户回答回答于

在您的js路由器文件(配置阶段)中,您需要添加:

$locationProvider.hashPrefix(''); 
$locationProvider.html5Mode(true);

在您的index.html文件中,您需要添加:

<base href="/">

更新1

在客户端实现上述之后,您还需要在服务器端配置url映射。使用#,服务器忽略后面跟着的任何内容。

http://localhost:8080/#i_will_be_ignored/and_so_do_i

因此,当您配置从URL中angularjs删除#时,您的上述请求

http://localhost:8080/i_will_be_ignored/and_so_do_i

现在,这将为您提供404,因为您从未为其映射过任何API。 这就是原因,你在页面刷新时得到404。

您需要映射与index.html不匹配的所有网址,然后是不匹配的网址。 一旦完成,angularjs将从那里获取它并重定向到适当的路线。 我希望这能帮到您。

扫码关注云+社区

领取腾讯云代金券