首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HDIV + Spring获取始终未经授权的访问错误HDIV_PARAMETER_DOES_NOT_EXIST

HDIV + Spring获取始终未经授权的访问错误HDIV_PARAMETER_DOES_NOT_EXIST
EN

Stack Overflow用户
提问于 2017-06-09 08:15:56
回答 1查看 483关注 0票数 0

我使用基于Spring配置的Spring的HDIV,这是我从它们的演示实现中派生出来的。配置会被加载,但是当我尝试访问受保护的URL(即"/messages/message“)时,总是会得到未经授权的访问错误HDIV_PARAMETER_DOES_NOT_EXIST。当我更改配置以从HDIV处理中排除URL时,它可以工作,但这当然不是一个选项

有人知道我错过了什么吗?

日志文件错误语句

代码语言:javascript
复制
10:04:17.304 [http-nio-8080-exec-22] INFO  org.hdiv.logs.Logger - HDIV_PARAMETER_DOES_NOT_EXIST;/spring-security-example/messages/message;_HDIV_STATE_;;;127.0.0.1;127.0.0.1;megloff;

Java配置

代码语言:javascript
复制
@Configuration
@EnableHdivWebSecurity
public class HdivSecurityConfig extends HdivWebSecurityConfigurerAdapter {

  @Override
  public void configure(SecurityConfigBuilder builder) {
  }

  @Override
  public void addExclusions(ExclusionRegistry registry) {
    registry.addUrlExclusions("/").method("GET");
    registry.addUrlExclusions("/login");
    registry.addUrlExclusions("/logout");
    registry.addUrlExclusions("/static/.*");
    registry.addParamExclusions("_csrf");  


    //  registry.addUrlExclusions("/messages/.*"); <-- would allow access, but not an option      
  }

  @Override
  public void configureEditableValidation(ValidationConfigurer validationConfigurer) {

    validationConfigurer.addValidation("/messages/.*");
    validationConfigurer.addValidation("/addUser");
  }
}

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {
    "ch.megloff.spring.security.example.mvc.controller",
    "ch.megloff.spring.security.example.mvc.action",
    "ch.megloff.spring.security.example.repository",
    "ch.megloff.spring.security.example.listener", 
    "ch.megloff.spring.security.example.service"})
public class SpringMVCConfiguration extends WebMvcConfigurerAdapter {

  @Autowired
  @Qualifier("hdivEditableValidator")
  private Validator hdivEditableValidator;

  @Override
  public Validator getValidator() {
    return hdivEditableValidator;
 }

 ...
}


public class SpringWebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

   @Override
   protected Class<?>[] getRootConfigClasses() {
    return new Class[] { SpringMVCConfiguration.class, SpringHibernateConfig.class, SpringSecurityConfiguration.class, SpringSecurityJDBCConfiguration.class, SpringWebFlowConfig.class, HdivSecurityConfig.class };
}

   @Override
   protected Class<?>[] getServletConfigClasses() {
    return new Class[] { SpringMVCConfiguration.class };
   }

   @Override
   protected String[] getServletMappings() {
    return new String[] { "/" };
   }

   public void onStartup(ServletContext container) throws ServletException {
    super.onStartup(container);

    container.addFilter("ValidatorFilter", ValidatorFilter.class).addMappingForUrlPatterns(
            EnumSet.of(DispatcherType.REQUEST), false, "/*");

    container.addListener(new InitListener());
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-09 14:48:05

我找到了解决办法。HDIV要求所有链接都在其URL中使用"_HDIV_STATE_“参数进行丰富。为了实现这一点,您必须使用HDIV中的taglib,而不是原始的JSTL。

有关JSTL,请参阅HDIV的参考文献

例如在您的POM中

代码语言:javascript
复制
    <dependency>
        <groupId>org.hdiv</groupId>
        <artifactId>hdiv-jstl-taglibs-1.2</artifactId>
        <version>${org.hdiv-version}</version>
    </dependency>

例如,在JSP中(注意taglib语句中的'www.hdiv.org‘)

<%@ taglib prefix="c" uri="http://www.hdiv.org/jsp/jstl/core"%> <c:url value="/messages/messages" var="url" /> <li><a href="${url}">Messages</a></li>

因此,您需要通过th <c:url>实用程序标记呈现URL。这将使用所需的HDIV参数呈现URL,即

代码语言:javascript
复制
localhost:8080/spring-security-example/messages/message?_HDIV_STATE_=26-0-830046F08D66980D1B35F52F2D6677E0

另一种选择可能是使用HDIV中的实用程序类(请参阅hdiv的github存储库中的LinkUrlProcessor类)。

代码语言:javascript
复制
LinkUrlProcessor urlProcessor = HDIVUtil.getLinkUrlProcessor(servletContext);
String processUrl = urlProcessor.processUrl(request, "/messages/messages");
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44452699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档