使用过滤器
过滤器要起作用,必须在主启动程序上加上@ServletComponentScan注解
@ServletComponentScan //扫描WebFilter的注解
package com.tj.reggie.filter;import com.alibaba.fastjson.JSON;import com.tj.reggie.controller.utils.R;import lombok.extern.slf4j.Slf4j;import org.springframework.util.AntPathMatcher;import javax.servlet.*;import javax.servlet.annotation.WebFilter;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;/*** 检查用户是否已经完成登录* "/*"是拦截所有访问*/@WebFilter(filterName = "loginCheckFilter", urlPatterns = "/*")@Slf4jpublic class LoginCheckFilter implements Filter {//路径匹配器,支持通配符public static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) servletRequest; //转成http请求HttpServletResponse response = (HttpServletResponse) servletResponse; //转成http响应//1.获取本次请求的URIString requestURI = request.getRequestURI();log.info("拦截到请求:{}", requestURI);//2.定义不需要处理的请求路径String[] uris = new String[]{"/users/login","/users/logout","/login.html","/logout.html","/img/**"};//3.判断本次请求是否需要处理boolean check = check(uris, requestURI);if (check) {//不需要处理的情况filterChain.doFilter(request, response);log.info("本次请求不需要处理:{}", requestURI);return;}//4.判断登录状态,如果已登录,则直接放行if (request.getSession().getAttribute("users") != null) {filterChain.doFilter(request, response);log.info("已经登录,用户id为:{}", request.getSession().getAttribute(("users")));return;}//5.如果未登录则返回未登录结果,通过输出流方式向客户端页面响应数据response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));log.info("未登录,返回响应数据:{}", requestURI);return;}/*** 路径匹配,检查本次请求是否需要放行** @param uris* @param requestURI* @return*/public boolean check(String[] uris, String requestURI) {for (String uri : uris) {boolean match = PATH_MATCHER.match(uri, requestURI);if (match) return true;}return false;}}
