目录

Life in Flow

知不知,尚矣;不知知,病矣。
不知不知,殆矣。

X

自定义拦截器

自定义拦截器

 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

作者:Soulboy