2.8 利用自定义注解检查登录状态_HCH996的博客-程序员宅基地

技术标签: 项目  

使用拦截器

  • 在方法前标注自定义注解
  • 拦截所有请求,只处理带有该注解的方法

自定义注解

  • 自定义注解基于元注解。
  •  @Target: 声明自定义的注解可以作用在什么位置?类上,还是方法上,属性上。
  • @Retention: 自定义注解保留的有效时间,编译器有效还是运行时有效。
  • @Document: 声明自定义注解在生成文档的时候,要不要把注解也带上去。
  • @Inherited:子类继承父类,父类有这个注解,子列是否需要继承父类的注解。
  • 自定义注解中@Target和@Retention是必须的,另外两个是非必须的,可以省略

获取注解

  • 在运行期间通过反射实现,获取方法上有没有自己想要的注解。Method.getDeclaredAnnotations()
  • 获取是否具有某种类型的注解(Method.getAnnotation(Class<T> annotationClass)

利用自定义注解的方式去使用拦截器解决检查登录状态的问题

1.定义注解:在annotation包下,创建一个LoginRequired注解

//注解只起到了一个标记的作用
@Target(ElementType.METHOD) //表示该注解用来描述方法
//只要打上了该标记,表示需要登录后才能被访问
@Retention(RetentionPolicy.RUNTIME)//表示程序运行时有效
public @interface LoginRequired {

}

2.在UserControlle之中的需要登录以后才能访问的方法上加上@LoginRequired的注解

    @LoginRequired
    @RequestMapping(path="/setting", method = RequestMethod.GET)
    @LoginRequired
    @RequestMapping(path="/header/{filename}", method = RequestMethod.GET)

3. 利用拦截器拦截带有 @LoginRequired注解的方法

  • 创建一个LoginRequiredInterceptor
@Component
public class LoginRequiredInterceptor implements HandlerInterceptor {
    @Autowired
    private HostHolder hostHolder;
    //需要在访问这个方法之前进行判断
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
                             Object handler) throws Exception {
        //首先需要判断拦截的模板是否是一个方法
        if(handler instanceof HandlerMethod){
            HandlerMethod handlerMethod = (HandlerMethod) handler;
            Method method = handlerMethod.getMethod();
            //按照指定类型去取注解
            LoginRequired loginRequired = method.getAnnotation(LoginRequired.class);
            //当前方法需要登录但实际却没有登录,直接返回错误
            if(loginRequired != null && hostHolder.getUser() == null){
                response.sendRedirect(request.getContextPath() + "/login");
                return false;
            }
        }
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}

4. 配置拦截器

  • 排除静态资源的请求,而其他的请求都拦截,对其中带有注解的方法人为地进一步判断能否通过。WebMvcConfig.java中。
  • 也就是说通过在方法上加注解,来取代在配置中加路径的方式提高开发的便捷度。
@Autowired
private LoginRequiredInterceptor loginRequiredInterceptor;
registry.addInterceptor(loginRequiredInterceptor)
         .excludePathPatterns("/**/*.css", "/**/*.js", "/**/*.jpg", "/**/*.jpeg", "/**/*.png");

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_37841366/article/details/109640830

智能推荐

win7安装django的几个报错_weixin_34000916的博客-程序员宅基地

1.运行django-admin.py startproject mysite生成mysite站点,要把C:\Python27\Scripts(django-admin.py在此目录下)加入系统路径。2.D:\mysite&gt;python manage.py runserver报错:The problem is in functools.py file。编辑C:\Pyth...

windows服务器如何开通telnet功能_阿门之恋的博客-程序员宅基地

一、背景公司用的是 windows server 2012 R2 作为服务器,有专门的服务器公司负责对端口的管理,当我们申请了某个端口后,如何判断这个端口是可以访问的呢,通常我们会使用 telnet 命令,但是有时服务器没有安装telnet,安装步骤如下:二、安装步骤...

Apache的安装部署与基本配置(修改端口,修改默认发布目录)、创建虚拟主机、访问控制、Apache支持的语言、HTTPS(加密认证 )_一纸离人醉的博客-程序员宅基地

一、Apache1、概念:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Apache HTTP Server(简称Apache)是Apache软件基金会的一个开放源码的网页服务器。是最流行的Web服务器端软件之一,有多种产品,可以支持SSL技术,支持多个虚拟主机。它快速、可靠并且可通过简单的API扩充,将Perl/Python等解释...

python入门讲解_【Python入门教程】 超详细讲解,1小时学会Python(不会来找我!)..._肖友的博客-程序员宅基地

1、为什么使用Python假设我们有这么一项任务:简单测试局域网中的电脑是否连通.这些电脑的ip范围从192.168.0.101到192.168.0.200.思路:用shell编程.(Linux通常是bash而Windows是批处理脚本).例如,在Windows上用ping ip 的命令依次测试各个机器并得到控制台输出.由于ping通的时候控制台文本通常是"Reply from ... " 而不通...

如何把SVG小图片转换为 html字体图表_如何把svg转成html_普通网友的博客-程序员宅基地

自制作的简单字体图表使用案例:查看demo 制作步骤: 1:登录制作工具在线网站 https://icomoon.io/ 2:右上角红色 按钮进入到:https://icomoon.io/app/...

随便推点

[锐捷客户端]提示虚拟网卡加载失败解决办法 - macOS系统_虚拟网卡加载失败,请尝试重新登录_阿莹yes的博客-程序员宅基地

在Mac上安装锐捷客户端以后,登录提示虚拟网卡加载失败,请尝试重新登录。查了资料,这是因为苹果系统System Integrity Protection机制阻止了虚拟网卡驱动加载需要把System Integrity Protection 关掉操作:1、关机2、开机的时候按住command+r键,大概10秒,出现苹果图标+加载进度条,放手,进入恢复模式3、成功进入本地恢复模式,依次打开:左上角的“实用工具”,“终端”4、在命令行中输入csrutil disable 确定,系统提示“suc.

想让抖音做到月入10W+,这些蹭热度的技巧必须要掌握!超详细!丨国仁网络资讯_国仁猫哥的博客-程序员宅基地

为什么都是蹭热点,别人都能蹭出10W+?很多人蹭热点,都是直接复制粘贴,同样的爆款模板换个人再拍一遍,这种玩别人剩下的怎么能火呢?这次直接教大家19个蹭热点的通用公式,任何热点都能套用,以后不用再跟风了!今年端午,只要任何有关做粽子、吃粽子的视频,一经发布都有可观的阅读量,于是衍生出一批依靠“端午”热点收获10W+的账号。这些10W+的内容中,除了每年必不缺席的“粽子制作教学”外,很多创作者开始寻求多角度的创作形式。本文统计了19个所有节日的通用公式。只要以后只要有节日,就能继续“量产”爆款。

关于BasicAuthenticationFilter 发生的outStream 冲突问题_LMS的算法小屋的博客-程序员宅基地

关于 BasicAuthenticationFilter 中的 java.lang.IllegalStateException: getOutputStream() has already been called for this response 报错问题某天在参照大佬的配置security的时候发生了如下的错误:java.lang.IllegalStateException: getOutputStream() has already been called for this response

安装Android Studio没有AndroidSDK选项问题_android studio没有sdk选项_白衣友吖的博客-程序员宅基地

安装Android Studio没有AndroidSDK选项问题废话不多说直接进入正题:Android Studio版本号:2020年版本废话不多说直接进入正题:STEP 1:打开Android Studio 点击 File,找到 Setting 后点进去STEP 2:依照图片找到Android SDKSTEP 3:点击编辑 EditSTEP 3:点击进去后会弹出上面的窗口,检查是否勾选后点击 Next 即可这就是以上全部内容啦!有疑问的童鞋欢迎评论区留言。...

视频教程-通过VS将本地web项目实时发布到服务器IIS下-.NET_weixin_33301886的博客-程序员宅基地

通过VS将本地web项目实时发布到服务器IIS下 从事软件开发7年,熟悉软件...

Android Studio 3.0.1版本打开项目以及输入法显示不出来,光标卡顿出现的一些问题_最爱吃西瓜的博客-程序员宅基地

由于要团队开发项目,也就两个人。肯定要用到版本控制,目前公司用的是SVN,上篇博客有写到,这是链接。链接:使用AndroidStudio进行SVN版本控制—代码上传但前提AS版本得一致,防止开发过程中出现一些不必要的错误。我之前用的是as2.3.3,但没有直接在上面更新,而是重新下载3.0.1的安装包,用的以前的风格和主题,装好之后同步项目的时候出现了一些依赖库无法下载,所以使用了镜像,下面是链接...

推荐文章

热门文章

相关标签