在开发web系统时,如果用户不登录,发现用户也可以直接正常访问系统,这种设计本身并不合理,那么我们希望看到的效果是,只有用户登录成功之后才可以正常访问系统,如果没有登录则拒绝访问。那么我们可以使用过滤器或者拦截器进行实现,当前使用的方式是在spring boot框架中使用过滤器实现。
- 首先在SpringBoot启动类上加上注解@ServletComponentScan
- 创建自定义的过滤器LoginFilter,其中需要给登录接口放行。因为登录的用户信息存在session中,所以可以根据session的信息进行判断用户是否已经登录过系统
-
package com.app.studypro.filter; import com.alibaba.fastjson.JSON; import com.app.studypro.common.ResultBean; 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; /** * 检查用户是否已经完成登录 * * @author Administrator */ @WebFilter(filterName = "loginFilter", urlPatterns = "/*") @Slf4j public class LoginFilter implements Filter { /** * 路径匹配器,支持通配符 * ? 匹配一个字符。不能匹配目录:这个字符不能是代表路径分隔符的/. * * 匹配0到多个字符. * ** 匹配多级目录. */ public static final AntPathMatcher PATH_MATCHER = new AntPathMatcher(); @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { // 定义不需要处理的请求路径,将登录请求路径排除在外 String[] urls = new String[]{ "/users/login" }; HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; //1、获取本次请求的URI String requestURI = request.getRequestURI(); log.info("拦截到请求:{}", requestURI); //2、判断本次请求是否需要处理 boolean check = check(urls, requestURI); //3、如果不需要处理,则直接放行 if (check) { log.info("本次请求{}不需要处理", requestURI); filterChain.doFilter(request, response); return; } //4、判断登录状态,如果已登录,则直接放行 Long userId = (Long) request.getSession().getAttribute("user"); if (userId != null) { log.info("用户已登录,用户id为:{}", userId); filterChain.doFilter(request, response); return; } log.info("用户未登录"); //5、如果未登录则返回未登录结果,通过输出流方式向客户端页面响应数据 // 解决响应中文乱码问题 response.setCharacterEncoding("utf-8"); response.getWriter().write(JSON.toJSONString(ResultBean.error("用户未登录"))); } /** * 路径匹配,检查本次请求是否需要放行 * * @param urls * @param requestURI * @return */ public boolean check(String[] urls, String requestURI) { for (String url : urls) { boolean match = PATH_MATCHER.match(url, requestURI); if (match) { return true; } } return false; } }
-