当访问部分网页的时候,必须处于登录状态,如果没有处于登录状态,则跳转到登录页面,可以使用过滤器来实现。
具体实现范例代码如下
可以使用spring提供的路径匹配器来对路径进行匹配,对复合要求的予以放行,其他页面需要处于登录才予以放行。
@WebFilter(filterName = "loginCheckFilter", urlPatterns = "/*")
@Slf4j
public class LoginCheckFilter implements Filter {
//路径匹配器,支持通配符
private static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
//获取本次请求的URI
String uri = request.getRequestURI();
log.info("拦截到了请求:{}", uri);
//定义不需要处理的路径
String[] urls = new String[]{
"/employee/login",
"/employee/logout",
"/backend/**",
"/front/**",
};
//判断本次的请求是否需要处理
boolean flag = check(urls, uri);
//如果flag为true,则表示不需要做任何处理,放行
if (flag) {
log.info("本次请求{}不作处理", uri);
filterChain.doFilter(request, response);
return;
}
//如果不是直接放行的路径,则需要先判断是否处于登录
if (request.getSession().getAttribute("employee") != null) {
log.info("用户已登录,用户id为:{}", request.getSession().getAttribute("employee"));
//将用户的id存在在ThreadLocal中
Long employeeId = (Long) request.getSession().getAttribute("employee");
BaseContext.setCurrentId(employeeId);
//放行
filterChain.doFilter(request, response);
return;
}
//如果用户没有登录,通过输入流的方式向页面输出数据
response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
return;
}
/**
* 路径匹配,判断当前路径是否需要放行
*
* @param urls
* @param uri
* @return
*/
private boolean check(String[] urls, String uri) {
for (String url : urls) {
boolean match = PATH_MATCHER.match(url, uri);
//如果跟可以放行的路径匹配,返回true
if (match) {
return true;
}
}
return false;
}
}