自定义拦截器
自定义拦截器
1package net.xdclass.online_xdclass.interceptor;
2
3import com.fasterxml.jackson.databind.ObjectMapper;
4import io.jsonwebtoken.Claims;
5import net.xdclass.online_xdclass.utils.JWTUtils;
6import net.xdclass.online_xdclass.utils.JsonData;
7import org.apache.commons.lang3.StringUtils;
8import org.springframework.web.servlet.HandlerInterceptor;
9import org.springframework.web.servlet.ModelAndView;
10
11import javax.servlet.http.HttpServletRequest;
12import javax.servlet.http.HttpServletResponse;
13import java.io.PrintWriter;
14
15public class LoginInterceptor implements HandlerInterceptor {
16
17 /**
18 * 进入到controller之前的方法
19 * @param request
20 * @param response
21 * @param handler
22 * @return
23 * @throws Exception
24 */
25 @Override
26 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
27
28 try {
29
30 String accesToken = request.getHeader("token");
31 if (accesToken == null) {
32 accesToken = request.getParameter("token");
33 }
34
35 if (StringUtils.isNotBlank(accesToken)) {
36 Claims claims = JWTUtils.checkJWT(accesToken);
37 if (claims == null) {
38 //告诉登录过期,重新登录
39 sendJsonMessage(response, JsonData.buildError("登录过期,重新登录"));
40 return false;
41 }
42
43 //解密成功则放行
44 Integer id = (Integer) claims.get("id");
45 String name = (String) claims.get("name");
46
47 request.setAttribute("user_id", id);
48 request.setAttribute("name", name);
49
50 return true;//放行
51
52 }
53
54 }catch (Exception e){}
55
56 sendJsonMessage(response, JsonData.buildError("登录过期,重新登录"));
57
58 return false;
59 }
60
61
62 /**
63 * 响应json数据给前端
64 * @param response
65 * @param obj
66 */
67 public static void sendJsonMessage(HttpServletResponse response, Object obj){
68
69 try{
70 //对象序列化成JSON
71 ObjectMapper objectMapper = new ObjectMapper();
72 response.setContentType("application/json; charset=utf-8");
73 PrintWriter writer = response.getWriter();
74 writer.print(objectMapper.writeValueAsString(obj));
75 writer.close();
76 response.flushBuffer();
77 }catch (Exception e){
78 e.printStackTrace();
79 }
80
81
82 }
83
84
85
86
87 @Override
88 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
89
90 }
91
92 @Override
93 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
94
95 }
96}
97
注册自定义拦截器、放行路径
1package net.xdclass.online_xdclass.config;
2
3import net.xdclass.online_xdclass.interceptor.LoginInterceptor;
4import org.springframework.context.annotation.Bean;
5import org.springframework.context.annotation.Configuration;
6import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
7import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
8
9/**
10 * 拦截器配置
11 *
12 * 不用权限可以访问url /api/v1/pub/
13 * 要登录可以访问url /api/v1/pri/
14 */
15
16@Configuration
17public class InterceptorConfig implements WebMvcConfigurer {
18
19
20 @Bean
21 LoginInterceptor loginInterceptor(){
22 return new LoginInterceptor();
23 }
24
25
26 @Override
27 public void addInterceptors(InterceptorRegistry registry) {
28
29 //拦截全部
30 registry.addInterceptor(loginInterceptor()).addPathPatterns("/api/v1/pri/*/*/**")
31 //不拦截哪些路径 斜杠一定要加
32 .excludePathPatterns("/api/v1/pri/user/login","/api/v1/pri/user/register");
33
34 WebMvcConfigurer.super.addInterceptors(registry);
35
36 }
37}
38
携带 token 查询个人信息接口
- 直接解密 token,获取个人信息
- 通过 token 解密查询数据库获取个人信息
Controller
1 /**
2 * 根据用户id查询用户信息
3 * @param request
4 * @return
5 */
6 @GetMapping("find_by_token")
7 public JsonData findUserInfoByToken(HttpServletRequest request){
8 //拦截器已解密token,并且user_id、name 设置到 request作用域中
9 Integer userId = (Integer) request.getAttribute("user_id");
10
11 if(userId == null){
12 return JsonData.buildError("查询失败");
13 }
14
15 User user = userService.findByUserId(userId);
16
17 return JsonData.buildSuccess(user);
18
19 }
20
service
interface
1public interface UserService {
2
3 /**
4 * 新增用户
5 * @param userInfo
6 * @return
7 */
8 int save(Map<String, String> userInfo);
9
10
11 String findByPhoneAndPwd(String phone, String pwd);
12
13 User findByUserId(Integer userId);
14}
15
impl
1 @Override
2 public User findByUserId(Integer userId) {
3
4 User user = userMapper.findByUserId(userId);
5 return user;
6 }
mapper
1package net.xdclass.online_xdclass.mapper;
2
3import net.xdclass.online_xdclass.model.entity.User;
4import org.apache.ibatis.annotations.Param;
5
6public interface UserMapper {
7
8 int save(User user);
9
10 User findByPhone(@Param("phone") String phone);
11
12
13 User findByPhoneAndPwd(@Param("phone") String phone, @Param("pwd") String pwd);
14
15 User findByUserId(@Param("user_id") Integer userId);
16}
17
XML
1 <select id="findByUserId" resultType="User">
2
3 select * from user where id=#{user_id}
4
5 </select>
model @JsonIgnore pwd
1package net.xdclass.online_xdclass.model.entity;
2
3import com.fasterxml.jackson.annotation.JsonIgnore;
4
5import java.util.Date;
6
7/**
8 * `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
9 * `name` varchar(128) DEFAULT NULL COMMENT '昵称',
10 * `pwd` varchar(124) DEFAULT NULL COMMENT '密码',
11 * `head_img` varchar(524) DEFAULT NULL COMMENT '头像',
12 * `phone` varchar(64) DEFAULT '' COMMENT '手机号',
13 * `create_time` datetime DEFAULT NULL COMMENT '创建时间',
14 */
15public class User {
16
17 private Integer id;
18
19 private String name;
20
21 @JsonIgnore
22 private String pwd;
23
24 private String headImg;
25
26 private String phone;
27
28 private Date createTime;
29
30 @Override
31 public String toString() {
32 return "User{" +
33 "id=" + id +
34 ", name='" + name + '\'' +
35 ", pwd='" + pwd + '\'' +
36 ", headImg='" + headImg + '\'' +
37 ", phone='" + phone + '\'' +
38 ", createTime=" + createTime +
39 '}';
40 }
41
42 public Integer getId() {
43 return id;
44 }
45
46 public void setId(Integer id) {
47 this.id = id;
48 }
49
50 public String getName() {
51 return name;
52 }
53
54 public void setName(String name) {
55 this.name = name;
56 }
57
58 public String getPwd() {
59 return pwd;
60 }
61
62 public void setPwd(String pwd) {
63 this.pwd = pwd;
64 }
65
66 public String getHeadImg() {
67 return headImg;
68 }
69
70 public void setHeadImg(String headImg) {
71 this.headImg = headImg;
72 }
73
74 public String getPhone() {
75 return phone;
76 }
77
78 public void setPhone(String phone) {
79 this.phone = phone;
80 }
81
82 public Date getCreateTime() {
83 return createTime;
84 }
85
86 public void setCreateTime(Date createTime) {
87 this.createTime = createTime;
88 }
89}
90
测试
1localhost:8081/api/v1/pri/user/find_by_token
2
3GET:Headers
4
5token
6
7xdclasseyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ4ZGNsYXNzIiwiaGVhZF9pbWciOiJodHRwczovL3hkLXZpZGVvLXBjLWltZy5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20veGRjbGFzc19wcm8vZGVmYXVsdC9oZWFkX2ltZy8xNS5qcGVnIiwiaWQiOjgsIm5hbWUiOiJhbGljZSIsImlhdCI6MTYxMDUwMzM5NSwiZXhwIjoxNjExMTA4MTk1fQ.Hru8k9bwXd32t2iQX-6br_30M-HwiYKVerfChv_Recw
8
9
10*** Response ***
11{
12 "code": 0,
13 "data": {
14 "id": 8,
15 "name": "alice",
16 "headImg": "https://xd-video-pc-img.oss-cn-beijing.aliyuncs.com/xdclass_pro/default/head_img/15.jpeg",
17 "phone": "12345678",
18 "createTime": "2021-01-13T02:02:28.000+00:00"
19 },
20 "msg": null
21}
22
23