package com.guet.exam.filter;
import com.auth0.jwt.JWT;
import com.auth0.jwt.exceptions.JWTDecodeException;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.guet.exam.common.PassToken;
import com.guet.exam.common.R;
import com.guet.exam.common.UserLoginToken;
import com.guet.exam.entity.Student;
import com.guet.exam.service.StudentService;
import com.guet.exam.utils.TokenUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
@Slf4j
@Component
public class LoginInterceptor extends R implements HandlerInterceptor {
/**
* 目标方法执行前
* 该方法在控制器处理请求方法前执行,其返回值表示是否中断后续操作
* 返回 true 表示继续向下执行,返回 false 表示中断后续操作
*
* @return
*/
@Autowired
private StudentService studentService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String token = request.getHeader("x-token");// 从 http 请求头中取出 token
// 如果不是映射到方法直接通过
if (!(handler instanceof HandlerMethod)) {
return true;
}
response.setCharacterEncoding("utf-8");
HandlerMethod handlerMethod = (HandlerMethod) handler;
Method method = handlerMethod.getMethod();
//检查方法是否有passtoken注解,有则跳过认证,直接通过
if (method.isAnnotationPresent(PassToken.class)) {
PassToken passToken = method.getAnnotation(PassToken.class);
if (passToken.required()) {
return true;
}
}
//检查有没有需要用户权限的注解
if (method.isAnnotationPresent(UserLoginToken.class)) {
UserLoginToken userLoginToken = method.getAnnotation(UserLoginToken.class);
if (userLoginToken.required()) {
// 执行认证
if (token == null) {
throw new RuntimeException("无token,请重新登录");
}
// 获取 token 中的 user id
String id;
try {
id = JWT.decode(token).getClaim("id").asString();
} catch (JWTDecodeException j) {
throw new RuntimeException("token不正确,请不要通过非法手段创建token");
}
//查询数据库,看看是否存在此用户,方法要自己写
LambdaQueryWrapper<Student> wrapper = new LambdaQueryWrapper<>();
try {
wrapper.eq(Student::getId,Integer.parseInt(id));
}catch (Exception e){
throw new RuntimeException(e.getMessage());
}
Student stu = studentService.getOne(wrapper);
if (stu == null) {
throw new RuntimeException("用户不存在,请重新登录");
}
// 验证 token
if (TokenUtils.verify(token)) {
return true;
} else {
throw new RuntimeException("token过期或不正确,请重新登录");
}
}
}
throw new RuntimeException("没有权限注解一律不通过");
}
/**
* 目标方法执行后
* 该方法在控制器处理请求方法调用之后、解析视图之前执行
* 可以通过此方法对请求域中的模型和视图做进一步修改
*/
// @Override
// public void postHandle (HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView
// modelAndView) throws Exception {
// System.out.println("postHandle执行{}");
//
// }
// /**
// * 页面渲染后
// * 该方法在视图渲染结束后执行
// * 可以通过此方法实现资源清理、记录日志信息等工作
// */
// @Override
// public void afterCompletion (HttpServletRequest request, HttpServletResponse response, Object handler, Exception
// ex) throws Exception {
// System.out.println("afterCompletion执行异常");
//
// }
}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
【资源说明】 Java开发基于教考分离的考试系统源码(课程设计).zipJava开发基于教考分离的考试系统源码(课程设计).zipJava开发基于教考分离的考试系统源码(课程设计).zipJava开发基于教考分离的考试系统源码(课程设计).zipJava开发基于教考分离的考试系统源码(课程设计).zipJava开发基于教考分离的考试系统源码(课程设计).zipJava开发基于教考分离的考试系统源码(课程设计).zip Java开发基于教考分离的考试系统源码(课程设计).zip Java开发基于教考分离的考试系统源码(课程设计).zip Java开发基于教考分离的考试系统源码(课程设计).zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
资源推荐
资源详情
资源评论
收起资源包目录
Java开发基于教考分离的考试系统源码(课程设计).zip (43个子文件)
pom.xml 3KB
src
main
resources
application.yml 681B
java
com
guet
exam
mapper
TeacherMapper.java 241B
PaperMapper.java 449B
StudentMapper.java 241B
controller
PaperController.java 1KB
TeacherController.java 842B
StudentController.java 3KB
utils
TokenUtils.java 2KB
ExamApplication.java 403B
service
StudentService.java 464B
Teacherservice.java 416B
impl
StudentSericeImpl.java 2KB
PaperServiceImpl.java 642B
TeacherServiceImpl.java 1KB
PaperService.java 253B
filter
LoginInterceptor.java 4KB
common
UserLoginToken.java 350B
R.java 778B
PassToken.java 345B
entity
Teacher.java 1KB
Paper.java 2KB
Student.java 2KB
form
FaceForm.java 614B
LoginForm.java 372B
config
WebMvcConfig.java 1KB
.idea
jarRepositories.xml 1KB
uiDesigner.xml 9KB
vcs.xml 180B
misc.xml 513B
compiler.xml 847B
.gitignore 176B
encodings.xml 186B
target
classes
application.yml 681B
com
guet
exam
mapper
StudentMapper.class 386B
controller
StudentController.class 7KB
service
StudentService.class 607B
impl
StudentSericeImpl.class 4KB
common
R.class 4KB
entity
Student.class 4KB
ExamApplication.class 1KB
form
LoginForm.class 786B
config
WebMvcConfig.class 2KB
共 43 条
- 1
资源评论
极客程序设计
- 粉丝: 7215
- 资源: 3585
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功