Springboot 拦截器 + 自定义注解,实现权限控制

本文介绍了如何使用Springboot的拦截器和自定义注解来实现权限控制。作者分享了自己的学习和工作经验,提供了一套完整的Java开发学习资料,并强调面试准备的重要性。此外,还邀请读者加入技术交流圈子共同进步。

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

@Retention(RetentionPolicy.RUNTIME)

public @interface OnlyAdmin {

}




![](https://img-blog.csdnimg.cn/20190710164020769.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N1bm55enlx,size_16,color_FFFFFF,t_70)



(2)在后台对应的方法上,打上@OnlyAdmin注解



/**

 * 删除博客文章

 */

@OnlyAdmin

@RequestMapping("/delete")

@ResponseBody

public Resp<String> delete(long id) {

    bokeService.delete(id);

    return Resp.success();

}



![](https://img-blog.csdnimg.cn/20190710165446768.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N1bm55enlx,size_16,color_FFFFFF,t_70)



(3) 在登陆拦截器中拦截请求,判断当前登陆用户是否拥有该权限(下面那几个方法不用实现)。



package com.zyq.interceptor;

import java.io.PrintWriter;

import java.util.Date;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.springframework.web.method.HandlerMethod;

import org.springframework.web.servlet.ModelAndView;

import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import com.zyq.annotation.OnlyAdmin;

import com.zyq.beans.User;

import com.zyq.consts.SessionKey;

import com.zyq.tools.DateTool;

/**

  • 登录拦截器

*/

public class LoginInterceptor extends HandlerInterceptorAdapter {

@Override

public boolean preHandle(HttpServletRequest request,

        HttpServletResponse response, Object handler) throws Exception {

    // 从session中获取用户对象(该对象在用户登录的时候存于session中)

    Object object = request.getSession().getAttribute(SessionKey.USER_OBJECT);

    // 用户未登录,则以游客身份登录

    if (object == null) {

        User user = new User();

        user.setId(-1L);

        user.setName("游客" + DateTool.formatDateTimeSecond(new Date()));

        request.getSession().setAttribute(SessionKey.USER_OBJECT, user);

    }

    // 请求的方法是否有注解

    boolean haveAnnotataion = handler.getClass().isAssignableFrom(HandlerMethod.class);

    if (haveAnnotataion) {

        // 检测是否有 @OnlyAdmin 注解

        OnlyAdmin oa = ((HandlerMethod)handler).getMethodAnnotation(OnlyAdmin.class);

        if (oa != null) {

            // 如果有 @OnlyAdmin则表明该方法只允许管理员删除

            Object user = request.getSession().getAttribute(SessionKey.USER_OBJECT);

            if (((User)user).getId().longValue() != 1L) { // 这里假设以ID为1为管理员

                response.setCharacterEncoding("UTF-8");

                response.setContentType("text/json;charset=utf-8");

                PrintWriter pw = response.getWriter();

                pw.flush();

                pw.println("{\"msg\":\"你未有该权限\"}");

                return false;

            }

        }

    }

    // 用户已登录,则返回true, 放行该请求

    return true;

}



@Override

public void afterCompletion(HttpServletRequest request,

        HttpServletResponse response, Object handler, Exception ex)

        throws Exception {

    // TODO Auto-generated method stub

    super.afterCompletion(request, response, handler, ex);

}



@Override

public void afterConcurrentHandlingStarted(HttpServletRequest request,

        HttpServletResponse response, Object handler) throws Exception {

    // TODO Auto-generated method stub

    super.afterConcurrentHandlingStarted(request, response, handler);

}



@Override

public void postHandle(HttpServletRequest request,

        HttpServletResponse response, Object handler,

        ModelAndView modelAndView) throws Exception {

    // TODO Auto-generated method stub

    super.postHandle(request, response, handler, modelAndView);

}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

总结

对于面试还是要好好准备的,尤其是有些问题还是很容易挖坑的,例如你为什么离开现在的公司(你当然不应该抱怨现在的公司有哪些不好的地方,更多的应该表明自己想要寻找更好的发展机会,自己的一些现实因素,比如对于我而言是现在应聘的公司离自己的家更近,又或者是自己工作到达了迷茫期,想跳出迷茫期等等)

image

Java面试精选题、架构实战文档

整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~

你的支持,我的动力;祝各位前程似锦,offer不断!

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

962)]

Java面试精选题、架构实战文档

整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~

你的支持,我的动力;祝各位前程似锦,offer不断!

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-X1E538rT-1712809733962)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值