springboot项目使用过滤器实现Filter
接口,在类上同时使用@WebFilter
与@Component
注解,导致urlPatterns
指定的拦截路径无法生效,出现拦截所有接口情况。
解决方案:
在类上去掉@Component
注解,在启动类添加@ServletComponentScan
注解。
import io.undertow.servlet.spec.HttpServletRequestImpl;
import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.Order;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Order(1)
//@Component
@WebFilter(filterName = "WebsocketFilter", urlPatterns = "/webSocket/**")
public class WebSocketFilter implements Filter {
@Autowired
private RedisTemplate redisTemplate;
@SneakyThrows
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) servletResponse;
String token = ((HttpServletRequest) servletRequest).getHeader("Sec-WebSocket-Protocol");
response.setHeader("Sec-WebSocket-Protocol",token);
String businessNo = ((HttpServletRequestImpl) servletRequest).getRequestURI().split("\\/")[3];
if (redisTemplate.opsForValue().get(businessNo) == null) {
throw new Exception("非法请求");
}
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
}
}
启动类上加上@ServletComponentScan
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
@SpringBootApplication
@MapperScan("xxx.xx.xx")
@ServletComponentScan
public class PaperlessOfficeApplication {
public static void main(String[] args) {
SpringApplication.run(PaperlessOfficeApplication.class, args);
}
}
@ServletComponentScan作用
SpringBootApplication 上使用@ServletComponentScan 注解后达到以下几个效果
- Servlet可以直接通过@WebServlet注解自动注册
- Filter可以直接通过@WebFilter注解自动注册
- Listener可以直接通过@WebListener 注解自动注册