Java Web学习(十)Java拦截器

一、引言

  我们日常开发中,经常会遇到这个场景:在访问系统功能前,需要用户登录,不登陆的话无法使用我们的系统,那么如果在每个方法前都加上登录代码...【emmm....我想应该不会有人这么干吧...】,常见的可以使用以下几种方式:

  • 使用AOP切面功能来实现
  • 实现WebMvcConfigurer接口,重写addCorsMappings()方法和addInterceptors()方法

  下面我们就一起来看下一下怎么实现吧~

二、代码实现

AOP切面方式

  切面方式配置的话,得配置到包路径下或者每个具体方法都要配置,个人不是很喜欢用切面的方式来配置拦截器,用来记录日志或者其他功能可以使用aop,这篇文章就不详细讲解了,只简单说明一下以切面方式实现时的大致模型,我们着重看下以另一种方式来实现拦截器的功能。

实现WebMvcConfigurer接口的方式

  WebMvcConfigurer配置类其实是Spring内部的一种配置方式,采用JavaBean的形式来代替传统的xml配置文件形式进行针对框架个性化定制,可以自定义一些HandlerInterceptorViewResolverMessageConverter

  基于java-based方式的spring mvc配置,需要创建一个配置类并实现WebMvcConfigurer 接口。在Spring Boot 1.5版本都是靠重写WebMvcConfigurerAdapter的方法来添加自定义拦截器,消息转换器等。SpringBoot 2.0 后,该类被标记为@Deprecated(弃用)。官方推荐直接实现WebMvcConfigurer或者直接继承WebMvcConfigurationSupport。

拦截器配置源码:

/**
 * 拦截器的属性配置
 *
 * @Author 有梦想的肥宅
 */
@Configuration//标识这是一个配置类
public class InterceptorConfiguration implements WebMvcConfigurer {

    /**
     * 重写addCorsMappings()解决跨域问题
     * 配置:允许http请求进行跨域访问
     *
     * @param registry
     * @Author 有梦想的肥宅
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")//指哪些接口URL需要增加跨域设置
                .allowedOrigins("*")//指的是前端哪些域名被允许跨域
                .allowCredentials(true)//需要带cookie等凭证时,设置为true,就会把cookie的相关信息带上
                .allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS")//指的是允许哪些方法
                .maxAge(3600);//cookie的失效时间,单位为秒(s),若设置为-1,则关闭浏览器就失效
    }

    /**
     * 重写addInterceptors()实现拦截器
     * 配置:要拦截的路径以及不拦截的路径
     *
     * @param registry
     * @Author 有梦想的肥宅
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //注册Interceptor拦截器(Interceptor这个类是我们自己写的拦截器类)
        InterceptorRegistration registration = registry.addInterceptor(new Interceptor());
        //addPathPatterns()方法添加需要拦截的路径
        registration.addPathPatterns("/**");                      //所有路径都被拦截
        //excludePathPatterns()方法添加不拦截的路径
        registration.excludePathPatterns(                         //添加不拦截路径
                "/demo/loginPage",            //登录页面的地址【不拦截】
                "/**/*.html",            //html静态资源
                "/**/*.js",              //js静态资源
                "/**/*.css"              //css静态资源
        );
    }
}

自定义拦截器源码:

/**
 * 拦截器
 * @Author 有梦想的肥宅
 */
public class Interceptor implements HandlerInterceptor {
    /**
     * 在请求处理之前进行调用(Controller方法调用之前)
     * @Author 有梦想的肥宅
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        System.out.println("执行了Interceptor的preHandle方法");
        try {
            //统一拦截(查询当前session是否存在UserInfoVO用户信息)(这里UserInfoVO会在每次登陆成功后,写入session)
            UserInfoVO user = (UserInfoVO) request.getSession().getAttribute("UserInfoVO");
            if (user != null) {
                return true;
            }
            //这里设置拦截以后重定向的页面,一般设置为登陆页面地址
            response.sendRedirect(request.getContextPath() + "/demo/loginPage");
        } catch (IOException e) {
            e.printStackTrace();
        }
        return true;//如果设置为false时,被请求时,拦截器执行到此处将不会继续操作
        //如果设置为true时,请求将会继续执行后面的操作
    }
}

参考文章:

原文地址:https://www.cnblogs.com/riches/p/12638551.html

时间: 2024-08-11 19:39:16

Java Web学习(十)Java拦截器的相关文章

【java web】过滤器、拦截器、监听器的区别

一.对比: 1.1 过滤器和拦截器的区别: ①拦截器是基于java的反射机制的,而过滤器是基于函数回调. ②拦截器不依赖与servlet容器,过滤器依赖与servlet容器. ③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用. ④拦截器可以访问action上下文.值栈里的对象,而过滤器不能访问. ⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次. ⑥拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注

java web 学习十六(JSP指令)

一.JSP指令简介 JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分. 在JSP 2.0规范中共定义了三个指令: page指令 Include指令 taglib指令 JSP指令的基本语法格式:<%@ 指令 属性名="值" %> 例如: 1 <%@ page contentType="text/html;charset=gb2312"%> 如果一个指令有多个属性,

java web 学习路线

Java Web学习路线   Java分成J2ME(移动应用开发),J2SE(桌面应用开发),J2EE(Web企业级应用),所以Java并不是单机版的,只是面向对象语言.建议如果学习Java体系的话可以这样去学习:   *第一阶段:Java基础,包括Java语法,面向对象特征,常见API,集合框架: *第二阶段:Java界面编程,包括AWT,事件机制,SWING,这个部分也可以跳过,用的时候再看都能来及: *第三阶段:Java API:输入输出,多线程,网络编程,反射注解等,Java的精华部分:

[原创]java WEB学习笔记6:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

[原创]java WEB学习笔记75:Struts2 学习之路-- 总结 和 目录

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

Java web 学习之旅

java web学习之旅 来公司十天了,感觉已经慢慢地融入了这个环境中,几个学长人都很好,都是在他们帮助下,我才能比较顺利的开始了学习java web的旅途. 来这里学习的第一个阶段是做一个简单的用户管理系统,其实,这对于我这个刚开始接触java web的“新手”来说还是有一点挑战的,所以在最开始制定学习计划的时候,我有意识的把时间拖的比较长,希望我又足够的时间来完成这个项目.而情况却比我想象的要好很多,现在8号我已经完成了,比预期的22号提前了十多天,可能是学习的过程因为有学长的帮助,比较简单

Java Web总结十九Filter过滤器

一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,Web开发人员通过Filter技术,对Web服务器管理的所有Web资源:例如Jsp,Servlet,静态图片文件或静态HTML文件等进行拦截,从而实现一些特殊的功能.例如实现URL级别的权限访问控制.过滤敏感词汇.自动登录.压缩响应信息等一些高级功能. Servlet API中提供了一个Filter接口,开发Web应用时,如果编写的Java类实现了这个接口,则把这个Java类称之为过滤器Filter.通过

Java 过滤器、监听器、拦截器的区别

原文:http://www.360doc.com/content/10/0601/09/495229_30616324.shtml 1.过滤器 Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是过滤字符编码.做一些业务逻辑判断等.其工作原理是,只要你在web.xml文件配置好要拦截的客户端请求,它都会帮你拦截到请求,此时你就可以对请求或响应(Request.Response)统一设置编码,简化操作:同时还可进行逻辑判断,如用户是否

Java Web学习系列——Maven Web项目中集成使用Spring、MyBatis实现对MySQL的数据访问

本篇内容还是建立在上一篇Java Web学习系列——Maven Web项目中集成使用Spring基础之上,对之前的Maven Web项目进行升级改造,实现对MySQL的数据访问. 添加依赖Jar包 这部分内容需要以下Jar包支持 mysql-connector:MySQL数据库连接驱动,架起服务端与数据库沟通的桥梁: MyBatis:一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架: log4j:Apache的开源项目,一个功能强大的日志组件,提供方便的日志记录: 修改后的pom.xm

Java Web学习(二) Eclipse的配置

Java Web学习(二) Eclipse的配置 一.下载Eclipse 1.进入Eclipse官网,进行下载 上图,下载Eclipse IDE for JaveEE Developers 版本,然后根据windows系统32位或64位,进行选择(建议64位).如果你的机器内存过小,可以选择Eclipse的旧版本:Eclipse Indigo .Eclipse Juno . Eclipse Kepler 等版本. 2.解压缩安装 打开压缩包,将里面的Eclipse 拖出到指定位置,进行解压缩.