java - 如何在 spring mvc 中对特定请求执行过滤器?

标签 java spring spring-mvc jakarta-ee spring-boot

<小时/>

下面是过滤器。

@Component
public class TestFilter extends GenericFilterBean {

@Override
public void doFilter(
  ServletRequest request, 
  ServletResponse response,
  FilterChain chain) throws IOException, ServletException {
    chain.doFilter(request, response);
    HttpServletRequest httpRequest = (HttpServletRequest) request;
    System.out.println("token is: "+httpRequest.getHeader("token"));
}    
}
<小时/>

下面是资源 我只想对第二个请求执行上述过滤器。

如何做到这一点,请帮忙......

@RestController
public class UserResourceImpl implements UserResource {

private final UserDao userDao;
private final AuthenticationService authenticationService;
@Autowired
public UserResourceImpl(final UserDao userDao,final AuthenticationService authenticationService) {
this.userDao = userDao; 
this.authenticationService = authenticationService;
}

@Override
@RequestMapping(method = RequestMethod.POST, value = "/api/user", produces = "application/json")
public ResponseEntity<?> create(final User user) {
    userDao.save(user);
    return new ResponseEntity<>("", HttpStatus.OK);
}

@Override
@RequestMapping(method = RequestMethod.GET, value = "/api/user", produces = "application/json")
public ResponseEntity<?> getUsers(final User user) {


enter code here
    // how to execute the above filter for this request only ?

    return new ResponseEntity<>("", HttpStatus.OK);
}

}

最佳答案

您可以尝试使用 HandlerInterceptorAdapter 。它通过 url 工作,而不是特定方法,所以它不完全是你想要的,但它应该工作:

public class MyInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //To work with a specific method on the url
        if(request.getMethod().equals("GET")){
            //Do stuff
        }

        return super.preHandle(request, response, handler);
    } 

    //There is also a postHandle and postCompletion method that can be override     
}

并在WebMvcConfigurerAdapter中注册它:

public class SpringMvcContextConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/yourUrl");
    }
}

另一个解决方案可能是将 Aspect 与 spring-mvc 结合使用,并在方法上设置 PointCut。

希望有帮助。

关于java - 如何在 spring mvc 中对特定请求执行过滤器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46954110/

相关文章:

java - 处理 API 请求时出现 MismatchedInputException

Java fx 打印文本

java - IntelliJ 调试器不会在 Maven 项目的断点处暂停

java - 如何在Spring Web Flow中的每个Dispatcher servlet之前调用拦截器?

java - 在 Spring MVC Controller 中获取查询字符串值

spring - 如何在 Spring MVC 中将复选框值传递给 Controller

Spring WebSockets - 如何仅将@DestinationVariable 应用于@SendTo 注释?

Java:OutOfMemory 使用 Robot#createScreenCapture(Rectangle)

java - 使用 Spring 集成/JCraft JSch 在 SFTP 服务器上内部复制文件

java - 如何在运行 gradlecompileJava 时修复相关子项目中的 "Cannot find symbol error"