目录
- 1 需求
- 2 实现
1 需求
对我们项目里面的借口做权限控制,或者登录控制,只有cookie信息,说明就是登录成功了,只有登录成功的才可以走对应的接口
2 实现
1 首先自定义权限拦截器,就是项目启动之后,我们在浏览器访问一个接口,首先就是走这个拦截器
类继承 AsyncHandlerInterceptor 自定义拦截器,这样这个我们自己写的类 ,就是拦截器类了
/**
* push cookies to model as cookieMap
* cookie拦截器,将前端传过来的cookie 放到 cookieMap 里面
* 将I18n 配置里面的信息 保存到项目里面
* 类继承 AsyncHandlerInterceptor 自定义拦截器
*
*/
@Component
public class CookieInterceptor implements AsyncHandlerInterceptor {
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// cookie 如果前端传过来 cookie
if (modelAndView!=null && request.getCookies()!=null && request.getCookies().length>0) {
HashMap<String, Cookie> cookieMap = new HashMap<String, Cookie>();
// 遍历cookie
for (Cookie ck : request.getCookies()) {
cookieMap.put(ck.getName(), ck);
}
// 将cookiemap放到 modelAndView 里面
modelAndView.addObject("cookieMap", cookieMap);
}
// static method 将I18n 文件 读取为 页面以识别的类
if (modelAndView != null) {
modelAndView.addObject("I18nUtil", FtlUtil.generateStaticModel(I18nUtil.class.getName()));
}
}
}
权限拦截器,也是走接口的时候,首先进入这个,这个里面根据注解判断有没有权限,意思是我们在我们的controller层上定义权限注解,这个拦截器里面判断这个注解,然后判断这个接口有没有权限走
/**
* 权限拦截
*
* @author xuxueli 2015-12-12 18:09:04
*/
@Component
public class PermissionInterceptor implements AsyncHandlerInterceptor {
@Resource
private LoginService loginService;
// handler 是将请求的方法进行封装之后的 对象
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (!(handler instanceof HandlerMethod)) {
return true; // proceed with the next interceptor 继续下一个拦截器
}
// if need login
boolean needLogin = true; // 是否需要登录,默认需要
boolean needAdminuser = false;// 是否需要管理员权限, 默认不需要
HandlerMethod method = (HandlerMethod)handler; // 适配器
// 从当前 的 方法上面 获取 权限限制 的注解
PermissionLimit permission = method.getMethodAnnotation(PermissionLimit.class);
if (permission!=null) {
// 如果注解不为空
needLogin = permission.limit();// 登录拦截 (默认拦截)
needAdminuser = permission.adminuser(); // 要求管理员权限 (默认否)
}
if (needLogin) {
// 登录拦截
// 根据cookie 判断是否登录,并且返回登陆者的信息
XxlJobUser loginUser = loginService.ifLogin(request, response);
if (loginUser == null) {
response.setStatus(302);
response.setHeader("location", request.getContextPath()+"/toLogin");
return false;
}
if (needAdminuser && loginUser.getRole()!=1) {
throw new RuntimeException(I18nUtil.getString("system_permission_limit"));
}
// XXL_JOB_LOGIN_IDENTITY 登录身份 key 用户信息
request.setAttribute(LoginService.LOGIN_IDENTITY_KEY, loginUser);
}
return true; // proceed with the next interceptor 进入写一个拦截器
}
}
权限注解
**
* 权限限制 注解
*
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface PermissionLimit {
/**
* 登录拦截 (默认拦截)
*/
boolean limit() default true;
/**
* 要求管理员权限
*
* @return
*/
boolean adminuser() default false;
}
以上只是自定义了拦截器,我们还要配置到我们的项目里面,或者这样说,要让我们的项目知道这个拦截器
/**
* web mvc config
* 全局配置,springMVC的 配置
*
*/
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
// 权限拦截器
@Resource
private PermissionInterceptor permissionInterceptor;
// cookie 拦截器
@Resource
private CookieInterceptor cookieInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 对全部的 接口 进行 权限拦截
registry.addInterceptor(permissionInterceptor).addPathPatterns("/**");
// 对全部的 接口 进行 cookie 拦截
registry.addInterceptor(cookieInterceptor).addPathPatterns("/**");
}
}
以上配置完成之后,整个项目启动之后,你在浏览器走接口,必须先走这两个拦截器里面的代码逻辑,之后才走你的controller层的逻辑