1,拦截器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 检查登录逻辑
HttpSession session = request.getSession();
Object loginUser = session.getAttribute("loginUser"); // 通过session属性的loginUser进行判断是否登录
if (loginUser != null){
return true;
}else {
request.setAttribute("msg","请登陆后访问");
// response.sendRedirect("/login");
request.getRequestDispatcher("/login").forward(request,response); // 使用重定向携带req res进行跳转
return false;
}
}
}

2,注册拦截器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 将类表示为配置类
@Configuration
// 开启mvc的注解驱动
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
// 拦截器 拦截所有路径,放行静态资源与登录页,错误页
@Override
public void addInterceptors(InterceptorRegistry registry) {
LoginInterceptor loginInterceptor = new LoginInterceptor();
InterceptorRegistration ir = registry.addInterceptor(loginInterceptor);
ir.addPathPatterns("/**");
ir.excludePathPatterns("/login","/js/**","/css/**","/images/**","/fonts/**","/html/**","/error");
}
}

3,Controller中配置访问登录页的路径及方法

1
2
3
4
5
6
7
8
9
10
/**
* 来登录页
* @return login
*/
@GetMapping(value = {"/login","/"})
public String loginPage(HttpSession session){
// 再次访问login页面即视为退出登录
session.setAttribute("loginUser",null);
return "login";
}

4,若此时配置完成后,登录拦截器生效,但放行的静态资源仍无法访问到,在WebConfig中配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = {
"classpath:/META-INF/resources/", "classpath:/resources/",
"classpath:/static/", "classpath:/public/" };
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
if (!registry.hasMappingForPattern("/webjars/**")) {
registry.addResourceHandler("/webjars/**").addResourceLocations(
"classpath:/META-INF/resources/webjars/");
}
if (!registry.hasMappingForPattern("/**")) {
registry.addResourceHandler("/**").addResourceLocations(
CLASSPATH_RESOURCE_LOCATIONS);
}
}
完整的拦截器注册配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
// 将类表示为配置类
@Configuration
// 开启mvc的注解驱动
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

// 拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
LoginInterceptor loginInterceptor = new LoginInterceptor();
InterceptorRegistration ir = registry.addInterceptor(loginInterceptor);
ir.addPathPatterns("/**");
ir.excludePathPatterns("/login","/js/**","/css/**","/images/**","/fonts/**","/html/**","/error");
}

// 异常解析器
@Override
public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
SimpleMappingExceptionResolver exceptionResolver = new SimpleMappingExceptionResolver();
Properties prop = new Properties();
prop.setProperty("java.lang.ArithmeticException", "error");
exceptionResolver.setExceptionAttribute("ex");
resolvers.add(exceptionResolver);
}

private static final String[] CLASSPATH_RESOURCE_LOCATIONS = {
"classpath:/META-INF/resources/", "classpath:/resources/",
"classpath:/static/", "classpath:/public/" };
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
if (!registry.hasMappingForPattern("/webjars/**")) {
registry.addResourceHandler("/webjars/**").addResourceLocations(
"classpath:/META-INF/resources/webjars/");
}
if (!registry.hasMappingForPattern("/**")) {
registry.addResourceHandler("/**").addResourceLocations(
CLASSPATH_RESOURCE_LOCATIONS);
}
}

}