目录

  • 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层的逻辑