思路
- 定义不需要拦截的路径
- 将获取的路径与定义的比较,来查看这个请求路径是否需要拦截
- 拦截进行处理
在springboot下使用过滤器
1.定义过滤器类,并实现Filter接口,在类上面写上@WebFilter(urlPatterns = “/*”)
- 引申一个问题:/*表示什么?
- 问题解决:urlPatterns 为拦截路径,/* 默认过滤所有(也可过滤html),不能写成/**
2.实现doFilter方法
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
//1、获取本次请求的URI
String requestURI = request.getRequestURI();
- 引深一个问题:URI是什么?
- 问题的解决:URL是URI的子集,Web上的每一种资源如:图片、文档、视频等,都是由URI定位的,这里定位指的是web上的资源相对于主机服务器来说,存放在服务器上的具体路径。URI就是一种资源定位机制,它是比较笼统地定位了资源,并不局限于客户端和服务器,而URL就定位了网上的一切资源,只要是网上的资源,都有唯一的URL.
3.定义不需要处理的请求路径
String[] urls = new String[]{
//需要放行的动态资源
"/employee/login",
//这个路径是点击登录按钮请求的路径,所有人家本来就是来登陆的,你不需要拦截
"/employee/logout",//用户点击退出按钮也不需要处理的
//静态资源都进行放行,因为我们只是拦截controller的请求,对于静态资源的请求看见也没事
"/backend/**",
"/front/**"
};
4.判断本次请求是否需要处理,即检查我们的请求路径如果在urls中就不处理
//路径匹配器,支持通配符,就可以查看我们此次请求的路径是否匹配我们的拦截路径
AntPathMatcher antPathMatcher =new AntPathMatcher();
boolean check = check(urls, requestURI);
//3、如果不需要处理,则直接放行
if(check){//返回true
log.info("本次请求{}不需要处理",requestURI);
filterChain.doFilter(request,response);
return;//放行就不需要处理了,让方法结束
}
public boolean check(String[] urls,String requestURI){
for (String url : urls) {
boolean match = antPathMatcher.match(url, requestURI);
if(match){
return true;
}
}
return false;
}
- 引申一个问题:if(check)表示什么?
- 问题的解答:当if里面写的就是boolean变量的时候,就是true的意思
- 注意一个问题: filterChain.doFilter(request,response);语句表示放行
5.如果已登录,则直接放行
if(request.getSession().getAttribute("employee") != null){
Long empId = (Long) request.getSession().getAttribute("employee");
BaseContext.setCurrentId(empId);
filterChain.doFilter(request,response);//放行
return;
}
6.如果未登录则返回未登录结果,通过输出流方式向客户端页面响应数据,前端页面负责跳转到登录页面
response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
return;
前端页面是这样写的
7.最后注意点: 需要在启动类上添加@ServletComponentScan
这样才会扫描到@WebFilter(urlPatterns = “/*”)