问题分析
用户如果不登录,直接访问系统首页,照样可以正常访问
我们希望必须登录成功之后才能访问系统中的页面,如果没有登录则跳转至登录界面
使用过滤器或者拦截器,在过滤器或拦截器中判断用户是否已经完成登录,如果没有登录则跳转至登录界面。
实现步骤
- 创建自定义过滤器LoginCheckFilter
- 在启动类上加入注解@ServletComponentScan
- 完善过滤器的处理逻辑
1.获取本次请求的URI
2.判断此次请求是否需要处理
3.如果不需要处理,直接放行
4.判断登录状态,如果已登录,则直接放行
5.如果未登录则返回登录结果
代码实现
前端拦截器:
// 响应拦截器
service.interceptors.response.use(res => {
if (res.data.code === 0 && res.data.msg === 'NOTLOGIN') {// 返回登录页面
console.log('---/backend/page/login/login.html---')
localStorage.removeItem('userInfo')
window.top.location.href = '/backend/page/login/login.html'
} else {
return res.data
}
}
过滤器:
/**
* 检查用户是否已经登陆成功
*/
@Slf4j
@WebFilter(filterName = "loginCheckFilter",urlPatterns = "/*")
public class LoginCheckFilter implements Filter {
//路径匹配器,支持通配符
public 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;
// 1.获取本次请求的 URI
String requestURI = request.getRequestURI();
// 2.判断此次请求是否需要处理
//定义不需要处理的请求路径
String[] urls = new String[]{
"/employee/login",
"/employee/logout",
"/backend/**",
"/front/**"
};
boolean check = check(requestURI, urls);
// 3.如果不需要处理,直接放行
if(check){
filterChain.doFilter(request,response);//放行
return;
}
// 4.判断登录状态,如果已登录,则直接放行
if(request.getSession().getAttribute("employee" )!= null){ //判断Session域中是否存在该id
filterChain.doFilter(request,response); //放行
return;
}
// 5.如果未登录则返回登录结果 通过输出流向客户端响应数据
response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
return;
}
//(判断本次请求是否在不需要处理的请求中)
public boolean check(String requestURI,String[] urls){
for (String url : urls) {
boolean match = PATH_MATCHER.match(url, requestURI);
if(match){
return true;
}
}
return false;
}
}
功能测试
注意清理浏览器缓存数据