为什么s:mvcUrl函数在不同的视图上返回不同的结果?

时间:2019-05-23 17:46:16

标签: java spring spring-mvc jsp

我正在两个不同的JSP文件上调用函数mvcUrl()。在第一个文件中,它返回预期的结果,但是在第二个文件中,它返回包含该JSP路径的URL。

我在Apache Tomcat 9上使用Spring MVC 4.1.0,Spring Security 4.0.0。

我一直在寻找有这个问题的人几个小时,但找不到类似的东西。我已经尝试了不同的Spring Security Rules,更改了控制器上的动作名称,为方法指定了明确的名称,但是没有任何效果。

我的Spring Security配置:

@Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/usuarios/**").hasRole(TipoUsuario.ADMIN.toString())
                .antMatchers("/contas/").hasRole(TipoUsuario.ADMIN.toString())
                .antMatchers("/contas/form").hasRole(TipoUsuario.ADMIN.toString())
                .antMatchers("/contas/cadastro").hasRole(TipoUsuario.ADMIN.toString())
                .antMatchers("/contas/fechar").hasRole(TipoUsuario.ADMIN.toString())
                .antMatchers("/contas/fechar/confirmar").hasRole(TipoUsuario.ADMIN.toString())
                .antMatchers("/relatorios/cliente").hasRole(TipoUsuario.ADMIN.toString())
                .antMatchers("/movimentacoes/**").authenticated()
                .antMatchers("/login").permitAll()
                .anyRequest().authenticated()
                .and().formLogin().loginPage("/login").permitAll().defaultSuccessUrl("/", false)
                .and().logout().logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
                .and().exceptionHandling().accessDeniedPage("/acessoNegado");
    }

我正在调用的方法:

@Controller
@RequestMapping("/movimentacao")
public class MovimentacaoController {

@RequestMapping(value="/cadastrar", method=RequestMethod.POST)
    public ModelAndView cadastrarMovimentacao(CadastroMovimentacaoWrapper wrapper,
            RedirectAttributes redirectAttributes, @AuthenticationPrincipal Usuario usuarioLogado) {
    [...]
}

}

可以正常工作的一个

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://www.springframework.org/tags" prefix="s"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>


<h1>${s:mvcUrl('MC#cadastrarMovimentacao').build() }</h1>

不是的:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://www.springframework.org/tags" prefix="s"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%> 


<h1>${s:mvcUrl('MC#cadastrarMovimentacao').build() }</h1>

我期望mvcUrl函数返回类似localhost:8080/movimentacao/cadastrar的东西(这正是我在第一个JSP中得到的东西),但是,我却得到类似localhost:8080/WEB-INF/views/colaborador/conta.jsp/movimentacao/cadastrar的东西。 (在第二个JSP上)

观察:'WEB-INF / views / colaborador / conta.jsp'是呈现此无效代码的视图的路径。

1 个答案:

答案 0 :(得分:0)

彻底分析代码后,我发现此行为的发生是由于JSP控制器中的ModelAndView对象正在通过mvcUrl调用呈现页面。

在工作案例中,我返回了ModelAndView对象的以下实例:modelAndView = new ModelAndView("admin/detalhe/conta"); 在另一种情况下,该实例为modelAndView = new ModelAndView("/colaborador/conta");

我在开头删除了多余的斜杠,并且错误不再存在。

现在,我想知道为什么它可以正确找到文件但是会干扰其他方法。