web中的拦截器

JavaWeb三大组件之一Filter(过滤器) 拦截所有访问web资源的请求或者响应(servlet、Jsp页面、HTML页面),从而实现我们自己的业务逻辑,这些逻辑可以是实现访问权限的控制、过滤敏感词、压缩响应等功能。过滤器是"链接"在容器的处理过程中的,它会在servlet处理器之前访问进入的请求,并且在响应信息返回客服端之前访问这些响应信息。这样就可以动态的修改请求和响应中的内容。创建web项目: 或者像这样建立web项目: 添加Tomcat服务器: 如果没有SmartTomcat,只有Tomcat像下面图片中这样: 则选择Tomcat里面的 阅读详情

拦截器

Filter过滤器

Filter过滤器它是JavaWeb的三大组件之一。三大组件分别是: Servlet 程序、Listener 监听器、Filter 过滤器
Filter过滤器它是JavaEE的规范。也就是接口
Filter过滤器它的作用是:拦截请求,过滤响应

Filter 的工作流程图

请添加图片描述

Filter 过滤器的使用

创建一个类实现Filter接口,实现接口方法

在doFilter方法中写功能需求

到 web.xml 中去配置 Filter 的拦截路径

创建拦截器

实现Filter接口

import java.util.logging.Filter;
/**
 * @author Huiex on 2021/11/8
 */
public class AdminFilter implements Filter {
    
	//doFilter 方法,专门用于拦截请求。可以做权限检查----------
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

功能需求

        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        HttpSession session = httpServletRequest.getSession();
        Object user = session.getAttribute("user");
	// 如果等于 null,说明还没有登录
        if (user == null) {      
            servletRequest.getRequestDispatcher("/login.jsp")
            				.forward(servletRequest,servletResponse);
            return;
        } else {
	// 让程序继续往下访问用户的目标资源
            filterChain.doFilter(servletRequest,servletResponse);
        }
    }
}

web.xml 中的配置

<!--filter 标签用于配置一个 Filter 过滤器-->
<filter>
												<!--给 filter 起一个别名-->
	<filter-name>AdminFilter</filter-name>
												<!--配置 filter 的全类名-->
	<filter-class>com.atguigu.filter.AdminFilter</filter-class>
</filter>

<!--filter-mapping 配置 Filter 过滤器的拦截路径-->
<filter-mapping>
								<!--filter-name 表示当前的拦截路径给哪个 filter 使用-->
	<filter-name>AdminFilter</filter-name>
					<!--url-pattern 配置拦截路径
					/ 表示请求地址为:http://ip:port/工程路径/ 映射到 IDEA 的 web 目录
					/ admin/* 表示请求地址为:http://ip:port/工程路径/admin/*-->
	<url-pattern>/admin/*</url-pattern>
    
</filter-mapping>

Filter的生命周期

Filter 的生命周期包含几个方法

  1. 构造器方法
  2. init 初始化方法 第 1,2 步,在 web 工程启动的时候执行(Filter 已经创建)
  3. doFilter 过滤方法 第 3 步,每次拦截到请求,就会执行
  4. destroy 销毁 第 4 步,停止 web 工程的时候,就会执行(停止 web 工程,也会销毁 Filter 过滤器)

FilterChain 过滤器链

FilterChain. doFilter() 方法的作用

执行下一个Filter过滤器(如果有Filter)

执行目标资源(没有Filter)

流程图

请添加图片描述

多个Filter过滤器执行的特点

多个Filter过滤器执行的时候,它们执行的优先顺序是由 他们在web. xmI中从上到下配置的顺序决定

多个Filter共同执行的时候,它们都使用同一个Request对象

Filter 的拦截路径

精确匹配

<url-pattern>/target.jsp</url-pattern>

以上配置的路径,表示请求地址必须为:http://ip:port/工程路径/target.jsp

目录匹配

<url-pattern>/目录名/*</url-pattern>

以上配置的路径,表示请求地址必须为:http://ip:port/工程路径/admin/*

后缀名匹配

<url-pattern>>*.html</url-pattern>

以上配置的路径,表示请求地址必须以.html 结尾才会拦截到

MVC拦截器

SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。开发者可以自己定义一些拦截器来实现特定的功能

区别

**过滤器与拦截器的区别:**拦截器是AOP思想的具体应用。

过滤器

  • servlet规范中的一部分,任何java web工程都可以使用
  • 在url-pattern中配置了/*之后,可以对所有要访问的资源进行拦截

拦截器

  • 拦截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能使用
  • 拦截器只会拦截访问的控制器方法, 如果访问的是jsp/html/css/image/js是不会进行拦截的

MVC拦截器的使用

创建一个类,实现HandlerInterceptor(处理程序拦截器)

package com.kuang.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyInterceptor implements HandlerInterceptor {

   //在请求处理的方法之前执行
   //如果返回true执行下一个拦截器  相当于FiltenChain
   //如果返回false就不执行下一个拦截器
   public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
       System.out.println("------------处理前------------");
       return true;
  }

   //在请求处理方法执行之后执行
   public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
       System.out.println("------------处理后------------");
  }

   //在dispatcherServlet处理后执行,做清理工作.
   public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
       System.out.println("------------清理------------");
  }
}

SpringSecurity(安全)

在web开发中,需要过滤器,拦截器

Spring Security是针对Spring项目的安全框架,也是Spring Boot底层安全模块默认的技术选型,他可以实现强大
的Web安全控制,对于安全控制,我们仅需要引入spring-boot-starter-security模块,进行少量的配置,即可实
现强大的安全管理

Spring Security的两个主要目标是“认证"和"授权”(访问控制)。
“认证”(Authentication)
"授权”(Authorization)

相关类

  • WebSecurityConfigurerAdapter: 自定义Security策略
  • AuthenticationManagerBuilder: 自定义认证策略
  • @EnableWebSecurity: 开启WebSecurity模式

依赖

        <!--security-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

拦截器

在config包下

SecurityConfig类

继承WebSecurityConfigurerAdapter

@EnableWebSecurity--------------
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    //重写  configure(HttpSecurity http)  固定的-----------------------
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //首页所有人可以访问, 功能页只有对应有权限的人才能访问--------------
        http.authorizeRequests()
                .antMatchers("/").permitAll()//任何人都可以访问 /下的目录
                .antMatchers("/level1/**").hasRole("vip1")vip1才可以访问/level1/下的目录
                .antMatchers("/level2/**").hasRole("vip2")
                .antMatchers("/level3/**").hasRole("vip3");

         //如果没有权限 会默认自动跳转到默认登陆页面 "/login"
        http.formLogin().loginPage("/login");

        //注销 开启了注销功能  
        //默认跳转到注销页面"/logout"  加上.logoutSuccessUrl()后可以指定跳转的页面
        http.logout().logoutSuccessUrl("/");

        //开启记住我功能
        http.rememberMe();

    }
"/"所有页面所有都能访问
 "/level1/**" 该页面只有"vip1"能访问(起作用)
 
Matchers	 匹配器
permitAll 	 运行所有
hasRole 	 起作用

认证

通过从内存或者数据库中得到用户信息,通过认证得到对应的权限级别

在config包下的SecurityConfig类中

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//        //这些数据正常应该从数据库中读
        auth.inMemoryAuthentication()
                .withUser("zjl").password("183303").roles("vip3")
                .and()//and() 用来拼接    			  roler() 角色
                .withUser("root").password("123456").roles("vip1","vip2","vip3");
    }
}

//通过认证后, root这个用户可以访问vip1、2、3 , zjl用户只,能访问vip3

//一般用户的roles是在数据库中得到的,或者从内存中得到,这里没有,就直接设置了

auth.inMemoryAuthentication() 身份验证 如果是通过jdbc验证,那么用auth.jdbcAuthentication()

密码加密

不加密的话会报 500 错误

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
		        auth.inMemoryAuthentication()
                    .passwordEncoder(new BCryptPasswordEncoder())//---------
                .withUser("zjl").password(new BCryptPasswordEncoder().//---------
                encode("183303")).roles("vip3")
                .and()
                .withUser("root").password(new BCryptPasswordEncoder().
                encode("123456")).roles("vip1","vip2","vip3");
    }
}

shrio

依赖

        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-core</artifactId>
            <version>1.4.1</version>
        </dependency>
		
		log4j
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jcl-over-slf4j</artifactId>
            <version>1.5.6</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.21</version>
        </dependency>

        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.12</version>
        </dependency>
从‘平行’到‘鱼骨’:手把手拆解AlGaN/GaN HEMT多栅指结构的布局优化实战 本文深入探讨了AlGaN/GaN HEMT多栅指结构的布局优化,从传统的平行栅结构到创新的鱼骨栅结构,详细解析了如何通过优化信号路径和热管理提升功率器件的性能。文章结合实测数据和EDA工具,展示了鱼骨栅结构在相位一致性、热阻和版图利用率方面的显著改进,为射频功率放大器设计提供了实用指导。 阅读详情

相关推荐

大数据实时+离线项目架构----智慧物流大数据平台(超流行框架!)

智慧物流大数据平台 文章目录智慧物流大数据平台一、项目背景二、逻辑架构三、解决方案技术亮点:数据流转四、项目的技术选型4.1流式处理平台4.2 分布式计算平台4.3 海量数据存储框架软件版本总结 一、项目背景 本项目基于一家大型物流公司研发的智慧物流大数据平台。该物流公司是国内综合性快递、物流服务商,并在全国各地都有覆盖的网点。经过多年的积累、经营以及布局,拥有大规模的客户群,日订单达上千万。如此规模的业务数据量,传统的数据处理技术已经不能满足企业的经营分析需求。公司需要基于大数据技术构建数据中心,从而挖

weixin_48143996的博客 6401

web开发中拦截器和过滤器的作用和区别-附上代码示例

Web开发中,拦截器(Interceptor)和过滤器(Filter)都是常用的组件,它们可以对HTTP请求进行预处理、后处理以及一些额外的操作。在这篇文章中,我们将详细讲述拦截器和过滤器的作用和区别,并使用Java代码举例说明它们的使用。一、拦截器和过滤器的作用二、拦截器和过滤器的区别范围不同拦截器是针对具体的某个请求进行的处理,比如处理SpringMVC框架下的请求。而过滤器则作用于整个应用程序,通过匹配URL路径来确定是否需要过滤该请求。执行顺序不同。

专注后端开发 1979

JavaWeb开发必备】过滤器和拦截器的功能特性及应用场景

JavaWeb开发中,过滤器(Filter)和拦截器(Interceptor)是非常重要的组件,它们可以对请求进行预处理和后处理,从而实现对请求的控制和管理。过滤器和拦截器都可以对请求进行预处理和后处理,但过滤器更加适合对请求进行过滤和修改,而拦截器更加适合对请求进行拦截和处理。过滤器的应用场景示例:对请求进行过滤和修改,如对请求进行字符编码转换、对请求进行安全验证等。拦截器的应用场景示例:对请求进行拦截和处理,如对请求进行权限验证、对请求进行日志记录等。过滤器可以对请求进行修改,从而实现对请求的增强。

m0_63411861的博客 1048

Java Web拦截器Interceptor、过滤器Filter及监听器Listener

拦截器Interceptor:HandlerInterceptor、HandlerInterceptorAdapter被废弃、拦截器实战; 过滤器Filter:责任链模式,延迟加载过滤器,中文乱码过滤器; 监听器Listener:EventListener、三类监听器接口、配置监听器、监听器实战、监听器和事件驱动模型的区别; 拦截器和过滤器的区别、过滤器和监听器的区别;

lonelymanontheway的博客 3283

JavaWeb-拦截器

拦截器的使用

wwl193206126的博客 306

Java Web中的拦截器、过滤器及监听器

一般情况下,HttpSessionActivationListener和HttpSessionBindingListener一起使用,这两个监听器比较特殊,实现这两个接口的类不需要在web.xml中进行注册,被钝化的JavaBean对象会被持久化到存储设备中,活化的JavaBean对象会被从存储设备中恢复,前提是该JavaBean对象实现Serializable接口。可以控制请求的控制器和方法,但控制不了请求方法里的参数(用于处理页面提交的请求响应并进行处理,如国际化,主题更换,过滤等)。

gghhb12的博客 1307

Java Web拦截器实战:深入理解与应用

在本章节中,我们将探索创建自定义拦截器的实际步骤。自定义拦截器可以用于多种场景,如日志记录、权限检查、性能监控等。理解拦截器的生命周期、配置方法以及它们是如何与业务逻辑关联起来的,对于开发高效、可维护的Web应用至关重要。创建自定义拦截器通常涉及以下步骤:首先,你需要定义一个实现了特定拦截器接口的类,这通常依赖于你使用的框架。例如,在Spring框架中,你通常需要实现接口。// 实现方法@Override// 方法逻辑@Override// 方法逻辑@Override。

weixin_36282234的博客 1109

java web拦截器配置_如何配置javaWeb日记拦截器Filter

如何配置javaWeb日记拦截器,jsp拦截器的实现,web.xml配置拦截器,Filter_Log.java文件实例,记录获取执行前的时间、获取访问的URI、根据执行前时间和执行后时间获取消耗的总时间,简单的Filter实例:Filter_Log.java文件源码:package com.cn.filter;import java.io.IOException;import javax.ser...

weixin_36163782的博客 623

【SpringBoot3】SpringBoot项目Web拦截器使用

在Spring Boot应用中,Web拦截器(Interceptor)是一种用于在请求处理的不同阶段执行自定义逻辑的机制。拦截器广泛应用于各种场景,以增强应用的功能性、安全性和可维护性。 在Spring Boot项目中实现Wen拦截器主要有以下几种方式 * 实现 `HandlerInterceptor` 接口 * 使用过滤器(`Filter`) * 使用 `@Aspect` 注解实现AOP拦截 这里主要介绍 `HandlerInterceptor` 接口 和 `Filter`

不积跬步无以至千里,不积小流无以成江海。一个喜欢学习分享的程序员 2099

java web中的拦截器、过滤器和监听器

目录 介绍一下 过滤器实现 拦截器实现 Servlet监听器实现 介绍一下 1、过滤器和拦截器(只针对Servlet的Filter接口和SpringMVC的HandlerInterceptor接口,不针对其它实现方式,手撸服务器的大神再见) 过滤器和拦截器都是将客户端的请求进行拦截处理,然后将请求转交给下一资源。其处理方式如下图所示。 拦截器和过滤都能实现相同的功能,那么...

好记性不如烂笔头 720

使用CXF为Web Service添加拦截器,自定义拦截器

使用CXF为Web Service添加拦截器,自定义拦截器

hfrujhv的博客 323

SpringBoot-Web开发之拦截器

本文介绍了Spring MVC中自定义拦截器HandlerInterceptor的实现与配置流程。通过实现HandlerInterceptor接口,可以定义preHandle、postHandle和afterCompletion方法来控制请求处理前后的逻辑。示例中的LoginInterceptor实现了登录检查功能,未登录用户将被重定向到登录页。配置类通过实现WebMvcConfigurer接口,将拦截器注册到容器并指定拦截规则(/**)和排除路径(静态资源等)。文章还详细说明了拦截器的执行流程:顺序执行p

zl979899的博客 391

web api添加拦截器

实现思路 1.标识控制器有拦截特性; 2.控制器拦截处理; 代码实现 1.标识控制器有拦截特性,代码: 1 2 3 4 5 [MyFilter] public string PostFindUser([FromBody]Userinfo user) {     return s

疯狂紫萧 3987

java web 过滤器跟拦截器的区别和使用

1、首先要明确什么是拦截器、什么是过滤器 1.1 什么是拦截器拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。 在Webwork的中文文档的解释为——拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执

qq_25843323的博客 3万+

JavaWeb——过滤器Filter和拦截器Interceptor

过滤器Filter和拦截器Interceptor

测试 1923

JavaWeb学习笔记:拦截器

当客户端发起请求时,Filter 过滤器可以将请求拦截下来,对请求进行一些判断,只有符合要求的请求才会放行。应用场景:登录验证,设置编码,过滤明杆字符等。

m0_72087285的博客 2188

Web 拦截器-interceptor

com.ztt.interceptor包下实现LoginCheckInterceptor类;LoginCheckInterceptor类中主要有三个方法preHandle()、postHandle()、afterCompletion();这三个方法spring已经实现好,可以不重写,但是为了实现拦截作用,一般需要对preHandle()方法进行重写。preHandle()的返回值是布尔类型,true表示放行、false表示拦截。

qq_41296039的博客 501

8、SpringBoot2 Web开发之拦截器使用及其原理

拦截器的使用以及实现原理

qq_36831305的博客 476

[JavaWeb]——过滤器filter与拦截器Interceptor的使用、执行过程、区别

过滤器与拦截器的区别,过滤器是JavaWeb的三大核心组件之一,它是用来拦截请求的,拦截到请求之后执行相应的逻辑决定是否放行该请求,从而实现一些特殊功能。注意:过滤器一般完成一些通用的操作,比如:登录校验、统一编码处理、敏感字符处理等。类似于过滤器。Spring框架中提供的,用来动态拦截controller层方法的执行。过滤器隶属Web容器,定义一个过滤器需实现Filter接口,并加入"/x")注解指定拦截路径。

Panci_的博客 2322

webclient】WebClient的创建、使用,自定义过滤器

在Spring5中,出现了Reactive响应式编程思想,并且为网络编程提供相关响应式编程的支持,如提供了WebFlux,它是Spring提供的异步非阻塞的响应式的网络框架,相比传统的SpringMVC框架,可以充分利用多CPU并行处理一些功能,虽然不能提高单个请求的响应能力,但是总体可以提高多核的服务器性能,提高系统吞吐量和伸缩性,特别适合于IO密集型服务。WebClient提供的基于响应式的非阻塞的Web请求客户端,相对于传统的RestTemplate,他不阻塞代码、异步执行。

morris 2961

dlt645-2007规约报文_DLT645-2007_智能电表_

dlt645-2007规约报文,是智能电表远操必备

上一篇: 19. 删除链表的倒数第 N 个结点
下一篇: Spring
Huiex胖子君
博客等级 码龄5年 3粉丝 84原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值