SpringBoot基于拦截器实现登录权限拦截

版权申明:本文为原创文章,转载请注明原文出处

原文链接:https://blog.it-follower.com/posts/706706877.html

需求

系统中,除登录接口/login以外,其他所有接口,必须用户登录后才能访问。

实现

创建一个拦截器,拦截除/login以外的所有请求,校验用户是否已登录,如果已登录,则放行,否则拦截请求,给出未登录信息提示。创建LoginInterceptor类,实现HandlerInterceptor接口,重写preHandle方法

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package com.yclouds.service.demo.interceptor;

import com.yclouds.common.core.error.code.BaseError;
import com.yclouds.common.core.response.ApiResp;
import com.yclouds.common.core.utils.JsonUtils;
import com.yclouds.common.core.utils.StringUtils;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.cors.CorsUtils;
import org.springframework.web.servlet.HandlerInterceptor;

/**
* 登录拦截器
*
* @author ye17186
* @version 2019/3/26 14:49
*/
public class LoginInterceptor implements HandlerInterceptor {

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws IOException {

// PreFlight请求,忽略本拦截器
if (CorsUtils.isPreFlightRequest(request)) {
return true;
}

boolean flg = false; // 是否通过
String token = request.getHeader("token");

// 有token表示用户已登录(生产环境应该校验token合法性)
if (StringUtils.isNotEmpty(token)) {
flg = true;
} else {
// 根据系统需要,返回特定的消息格式
ApiResp resp = ApiResp.retFail(BaseError.SYSTEM_NO_LOGIN);
write(request, response, JsonUtils.toJson(resp));
}
return flg;
}

/**
* 通过response返回错误信息给前端
*
* @param request 请求
* @param response 响应
* @param content 响应内容
*/
private void write(HttpServletRequest request, HttpServletResponse response, String content)
throws IOException {

String origin = request.getHeader("Origin");
response.setHeader("Access-Control-Allow-Origin", origin);
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json; charset=utf-8");
response.getWriter().write(content);
}
}

注册该拦截器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package com.yclouds.service.demo.config;

import com.yclouds.service.demo.interceptor.LoginInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
* 拦截器配置
*
* @author ye17186
* @version 2019/3/26 15:00
*/
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {

@Override
public void addInterceptors(InterceptorRegistry registry) {

// 注册登录拦截器,拦截除/login以外的所有请求
registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**")
.excludePathPatterns("/login");
}
}

测试

1
2
3
4
5
@GetMapping("/say3")
public ApiResp sayHello3() {
log.info("业务处理...");
return ApiResp.retOK();
}
  • 发送不带token的请求,请求被拦截,并返回的错误信息提示

  • 发送带token的请求,请求正确处理

评论