在开发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();@Overridepublic 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、获取本次请求的URIString 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;}}
-