1. 完善登录功能
前面我们已经完成了后台系统的员工登录功能开发,但还是存在一个问题,就是我们用户如果不登录直接访问系统首页,照常可以访问。
显然,这种情况是不合理的,我们希望看到的效果应该是,只有登录成功才可以访问系统的首页,如果每页登录则跳转到登录页面。
那么,如何实现这种功能呢?
答案就是拦截器或者过滤器,在拦截器或者过滤器中判断用户是否登录,每页登录则跳转到登录页面。
1.1 创建自定义过滤器LoginCheckFilter
我们新建一个包filter,在包里添加LoginCheckFilter过滤器。我们需要在类上添加@WebFilter注解标志该类为过滤器,并且需要声明过滤器名称以及拦截规模,/*即表明全部拦截。
@WebFilter(filterName = "LoginCheckFilter",urlPatterns = "/*")
@Slf4j
public class LoginCheckFilter implements Filter {
}
1.2 在启动类添加注解@ServletComponentScan
@Slf4j
@SpringBootApplication
//扫描拦截器的注解声明
@ServletComponentScan(basePackages = "com.hx.filter")
public class BingBingApplication {
public static void main(String[] args) {
SpringApplication.run(BingBingApplication.class,args);
System.out.println("项目初始化完成");
log.info("项目启动成功");
}
}
1.3 完善过滤器的处理逻辑
过滤器的处理逻辑如下:
* 1. 获取本次请求的uri,并定义不需要拦截的路径请求
* 2. 判断是否是需要拦截的路径
* 3. 如果不需要处理,直接放行
* 4. 判断是否登录,登录就放行
* 5. 如果未登录就响应未登录,与前端进行信息交互。
/**
* 过滤器,检查用户是否登录
* 开启过滤器需要在启动类添加@ServletComponentScan进行过滤器扫描
*/
@WebFilter(filterName = "LoginCheckFilter",urlPatterns = "/*")
@Slf4j
public class LoginCheckFilter implements Filter {
//路径匹配器,可以匹配一个通配符
private static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();
public boolean check(String[] uris,String requestURI){
for (String uri : uris) {
boolean flag = PATH_MATCHER.match(uri, requestURI);
if(flag){
return true;
}
}
return false;
}
@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();
String[] uris = new String[]{
"/employee/login",
"/employee/logout",
"/backend/**",
"/front/**"
};
//2. 判断是否是需要拦截的路径
boolean check = check(uris, requestURI);
//3. 如果不需要处理,直接放行
if(check){
//对拦截到的请求进行放行操作
filterChain.doFilter(request,response);
return;
}
//4. 判断是否登录,登录就放行
//从我们存入的session中获取数据,如果session中有数据,则表明登录成功,放行
HttpSession session = request.getSession();
Object employee = session.getAttribute("employee");
if(employee!=null){
filterChain.doFilter(request,response);
return;
}
// 5. 如果未登录就响应未登录,与前端进行信息交互。
//write传递字符串,需要将R对象转换成JSON字符串,传递的信息需要跟requset.js中的信息匹配。
response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
return;
}
}
注意,第五步中跟前端进行交互返回的信息需要跟前端进行匹配。我们来看一下前端响应拦截器的方法。
第一个红框是根据服务端返回的数据进行判断,判断服务端返回的data中code是不是为0并且msg是不是为NOTLOGIN,判断通过的话就执行下面红框中页面跳转的操作。
设置拦截器之后,如果用户为进行登录就访问首页就会自动跳转到登陆页面。
这里我们访问一下首页,回车,因为没有登录,因此就会进行登录页面跳转
2. 静态资源映射
我们将前端开发人员提供的页面信息直接放到我们的resource目录下,启动我们的服务器是无法直接访问到的,因此,我们需要设置一个静态资源映射器,映射我们的静态资源页面
首先我们需要定义一个类来继承我们的WebMvcConfigurationSupport,并实现该类中的addResourceHandlers方法。然后重写该方法。将我们路径中包含/backend/**就帮我们映射到classpath:/backend/指定位置。
记得添加@Configuration注解将其标志为我们的配置类。
@Slf4j
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
/**
* 设置我们的静态资源映射
* @param registry
*/
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
//路径中包含/backend/**就帮我们映射到classpath:/backend/指定位置。
registry.addResourceHandler("/backend/**").addResourceLocations("classpath:/backend/");
registry.addResourceHandler("/front/**").addResourceLocations("classpath:/front/");
}
}