自定义注解用于权限控制.txt package com.wuliu.controller.tsj;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/** * 自定义
package com.wuliu.controller.tsj; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * 自定义注解(类似与spring security 的@PreAuthorize)用于权限控制 * @author tsj : 2017年11月13日 上午11:59:36 */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface Auth { String value() default ""; String name() default ""; } package com.wuliu.controller.tsj; import java.io.PrintWriter; import java.util.Set; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.http.HttpStatus; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; /** * 处理controller的@RequestMapping方法(这里的处理直接通过response处理,spring security先抛异常,然后再统一处理异常): * a.如果这个方法没有使用Auth注解,会认为没有作权限控制,任何人可以访问. * b.如果这个方法只标注了@Auth,如果用户没登录,会返回一个403,并提示用户登录. * c.如果这个方法标注了具体需要某种权限,如@Auth("authority"),就要求用户必须有这种权限,否则返回403,并提示用户没有权限,这里相当于实现授权,并且授权之前先认证 * * 验证权限 * @author tsj : 2017年11月13日 上午11:07:39 */ public class AuthInterceptor extends HandlerInterceptorAdapter { public static final String SESSION_USERID = "kUSERID"; public static final String SESSION_AUTHS = "kAUTHS"; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { boolean flag = true; if(handler instanceof HandlerMethod){ Auth auth = ((HandlerMethod) handler).getMethod().getAnnotation(Auth.class); if(auth != null){ // 说明方法有权限控制 if(request.getSession().getAttribute(SESSION_USERID) == null){ //没有登录 response.setStatus(HttpStatus.FORBIDDEN.value()); response.setContentType("text/html; charset=UTF-8"); PrintWriter pw = response.getWriter(); pw.write("{\"type\":\"nosignin\",\"msg\":\"请您先登录!!!\"}"); pw.flush(); pw.close(); flag = false; }else{ //用户已登陆 //如果方法上仅仅是@Auth,表示登录就能访问 if(!"".equals(auth.value())){ //如果是@Auth("authority")这样有value值,就需要验证相应的权限 Setauths = (Set ) request.getSession().getAttribute(SESSION_AUTHS); if(!auths.contains(auth.value())){ //没有权限 response.setStatus(HttpStatus.FORBIDDEN.value()); response.setContentType("text/html; charset=UTF-8"); PrintWriter pw = response.getWriter(); pw.write("{\"type\":\"nosignin\",\"msg\":\"对不起,您没有"+auth.name()+"权限!!!\"}"); pw.flush(); pw.close(); flag = false; } } } } } return flag; } }