20190802 Spring MVC拦截器

本文详细介绍SpringMVC中拦截器HandlerInterceptorAdapter的使用方法,包括如何通过拦截器进行登陆权限判断,以及如何利用HandlerMethod获取方法上的@LoginPermission注解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

@LoginPermission注解的使用

通过拦截器进行判断,通过方法签名获取当前访问的方法上面是否使用@LoginPermission注解

 

Spring MVC中的拦截器/过滤器HandlerInterceptorAdapter的使用

Spring MVC的拦截器,不仅可实现Filter的所有功能,还可以更精确的控制拦截精度。 

Spring MVC提供的org.springframework.web.servlet.handler.HandlerInterceptorAdapter这个适配器,继承此类可以非常方便的实现自己的拦截器

1)preHandle在业务处理器处理请求之前被调用。预处理,可以进行编码、安全控制等处理(判断用户是否有登陆权限,项目中有使用); 

2)postHandle在业务处理器处理请求执行完成后,生成视图之前执行。

HandlerMethod(方法处理器)封装了很多属性,在访问请求方法的时候可以方便的访问到方法、方法参数、方法上的注解、所属类等并且对方法参数封装处理,也可以方便的访问到方法参数的注解等信息。

 

/**
 * 1)打印请求头信息
 * 2)进行登陆权限判断
 */
@Component
public class GlobalInterceptor extends HandlerInterceptorAdapter {

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    @Autowired
    private RedisUtils redisUtils;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if (handler instanceof HandlerMethod) {
            HandlerMethod handlerMethod = (HandlerMethod) handler;
            if (handlerMethod.getBean() != null && handlerMethod.getBean() instanceof BaseController) {
                //BaseController baseController = (BaseController) handlerMethod.getBean();
                logger.info("request header and params----->" + getRequestInfo(request));
                Method method = handlerMethod.getMethod();
                LoginPermission loginPermission = method.getAnnotation(LoginPermission.class);
                if (loginPermission != null) {
                    PicaUser user = this.getPicaUser(request);
                    logger.info("picaUser----->" + user.toString());
                    //logger.info("picaUser----->" +JSONObject.toJSONString(user);
                    if (null == user || user.getId() == null || user.getId() == 0) {
                        response.setContentType("application/json; charset=utf-8");
                        PrintWriter writer = response.getWriter();
                        writer.print(JSONObject.toJSONString(BaseResult.buildSuccess(null), new SerializerFeature[]{SerializerFeature.WriteMapNullValue, SerializerFeature.WriteDateUseDateFormat}));
                        writer.close();
                        response.flushBuffer();
                        return false;
                    }
                }
            }
        }
        return true;
    }

    /**
     * 如果用户登陆成功,获取用户信息
     *
     * @param request
     * @return
     */
    private PicaUser getPicaUser(HttpServletRequest request) throws Exception {
        String user = request.getHeader("picaUser");
        String token = request.getHeader("token");
        PicaUser picaUser = null;
        //一般是空的
        if (!StringUtils.isEmpty(user)) {
            user = URLDecoder.decode(user, "utf-8");
            picaUser = (PicaUser) JSONObject.parseObject(user, PicaUser.class);
        }
        if (!StringUtils.isEmpty(token)) {
            picaUser = (PicaUser) this.redisUtils.getToken(token, PicaUser.class);
        }
        return picaUser;
    }

    /**
     * 获取请求信息
     *
     * @param request
     * @return
     */
    private Map<String, Object> getRequestInfo(HttpServletRequest request) {
        HashMap<String, Object> map = new HashMap<>();
        Enumeration<String> headerNames = request.getHeaderNames();
        while (headerNames.hasMoreElements()) {
            String key = headerNames.nextElement();
            Object value = request.getHeader(key);
            map.put(key, value);
        }
        return map;
    }
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值