今天在写项目的时候发现了一个问题,像一些接口的权限校验我,应该怎么实现呢?校验权限就需要在数据走到接口之前就需要进行校验,但是我应该怎么进行对接口之前进行数据处理呢?这里我们就需要说到一个功能,在Web类相关功能中大家一定会碰到,就是Filter过滤器的使用
一:概述
Filter 表示过滤器,是 JavaWeb 三大组件(Servlet、Filter、Listener)之一。Servlet 我们之前都已经学习过了,Filter和Listener 我们今天都会进行学习。
过滤器可以把对资源的请求==拦截==下来,从而实现一些特殊的功能。
浏览器可以访问服务器上的所有的资源(servlet、jsp、html等)
而在访问到这些资源之前可以使过滤器拦截来下,也就是说在访问资源之前会先经过 Filter,如下图
二:快速入门
进行 Filter
开发分成以下三步实现
-
定义类,实现 Filter接口,并重写其所有方法
配置Filter拦截资源的路径:在类上定义 @WebFilter
注解。而注解的 value
属性值 /*
表示拦截所有的资源
在doFilter方法中输出一句话,并放行
Filter在拦截路径的配置
拦截路径表示 Filter 会对请求的哪些资源进行拦截,使用 @WebFilter
注解进行配置。如:@WebFilter("拦截路径")
拦截路径有如下四种配置方式:
-
拦截具体的资源:/index.jsp:只有访问index.jsp时才会被拦截
-
目录拦截:/user/*:访问/user下的所有资源,都会被拦截
-
后缀名拦截:*.jsp:访问后缀名为jsp的资源,都会被拦截
-
拦截所有:/*:访问所有资源,都会被拦截
三:我的错误示范SpringBoot中通过上述方法使用Filter但是未生效--校验是否登录
1.在springBoot项目中同样可以利用SpringMVC的方法进行静态资源访问
2.为了避免未登录的用户也可以访问我的管理页面,我们就可以在过滤器中进行限制,如果登录过了就进行放行,否则就让提示错误信息.
@WebFilter("/*")
@Slf4j
public class ProjectFilter implements Filter {
public static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
//将这些静态资源需要放行
String[] urls = {"/employee/login"
, "/employee/logout"
, "/backend/**"
, "/front/**"
, "/common/upload"
, "/common/download"
, "/user/sendMsg"
, "/user/login"};
for (String url : urls) {
if (PATH_MATCHER.match(url, req.getRequestURI())) {
//放行
chain.doFilter(request, response);
return;
}
}
//判断是否登陆过
HttpSession session = req.getSession();
if (session.getAttribute("Employee") != null) {
//已经登陆过了直接放行
Long employee = (Long) session.getAttribute("Employee");
//将员工id存放在ThreadLoacd中,便于后期使用
ThreadLocalUtil.set(employee);
return;
}
if (session.getAttribute("User") != null) {
//已经登陆过了直接放行
Long user = (Long) session.getAttribute("User");
//将员工id存放在ThreadLoacd中,便于后期使用
ThreadLocalUtil.set(user);
return;
}
//未登录
log.info("用户未登录!");
resp.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
return;
}
}
3.但是发现并没有生效,当我注释掉静态资源发现依然可以访问,简直就是没有生效,最终发现了原因,在SpringBoot项目加入过滤器还需要在启动类加上@ServletComponentScanc才可以生效
加上上面的注解才将一些东西过滤掉,完成Demo