web中的拦截器
过滤器它是的三大组件之一。三大组件分别是: 程序、 监听器、 过滤器
过滤器它是的规范。也就是接口
过滤器它的作用是:拦截请求,过滤响应
的工作流程图
过滤器的使用
创建一个类实现接口,实现接口方法
在方法中写功能需求
到 web.xml 中去配置 的拦截路径
创建拦截器
实现接口
import java.util.logging.Filter;
/*** @author Huiex on 2021/11/8*/
public class AdminFilter implements Filter {//doFilter 方法,专门用于拦截请求。可以做权限检查----------@Overridepublic 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-name>AdminFilterfilter-name><filter-class>com.atguigu.filter.AdminFilterfilter-class>
filter>
<filter-mapping><filter-name>AdminFilterfilter-name><url-pattern>/admin/*url-pattern>filter-mapping>
的生命周期
的生命周期包含几个方法
构造器方法init 初始化方法 第 1,2 步,在 web 工程启动的时候执行( 已经创建) 过滤方法 第 3 步,每次拦截到请求,就会执行 销毁 第 4 步,停止 web 工程的时候,就会执行(停止 web 工程,也会销毁 过滤器) 过滤器链
. () 方法的作用
执行下一个过滤器(如果有)
执行目标资源(没有)
流程图
多个过滤器执行的特点
多个过滤器执行的时候,它们执行的优先顺序是由 他们在web. xmI中从上到下配置的顺序决定
多个共同执行的时候,它们都使用同一个对象
的拦截路径
精确匹配
<url-pattern>/target.jspurl-pattern>
以上配置的路径,表示请求地址必须为::port/工程路径/.jsp
目录匹配
<url-pattern>/目录名/*url-pattern>
以上配置的路径,表示请求地址必须为::port/工程路径/admin/*
后缀名匹配
<url-pattern>>*.html</url-pattern>
以上配置的路径,表示请求地址必须以.html 结尾才会拦截到
MVC拦截器
的处理器拦截器类似于开发中的过滤器,用于对处理器进行预处理和后处理。开发者可以自己定义一些拦截器来实现特定的功能
区别
**过滤器与拦截器的区别:**拦截器是AOP思想的具体应用。
过滤器
拦截器
MVC拦截器的使用
创建一个类,实现(处理程序拦截器)
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("------------清理------------");}
}
(安全)
在web开发中,需要过滤器,拦截器
是针对项目的安全框架,也是 Boot底层安全模块默认的技术选型,他可以实现强大
的Web安全控制,对于安全控制,我们仅需要引入-boot--模块,进行少量的配置,即可实
现强大的安全管理
的两个主要目标是“认证"和"授权”(访问控制)。
“认证”()
"授权”()
相关类 依赖
<dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-securityartifactId>dependency>
拦截器
在包下
类
继承
@EnableWebSecurity--------------
public class SecurityConfig extends WebSecurityConfigurerAdapter {//重写 configure(HttpSecurity http) 固定的-----------------------@Overrideprotected 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 起作用
认证
通过从内存或者数据库中得到用户信息,通过认证得到对应的权限级别
在包下的类中
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected 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.on() 身份验证 如果是通过jdbc验证,那么用auth.()
密码加密
不加密的话会报 500 错误
@Overrideprotected 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.shirogroupId><artifactId>shiro-coreartifactId><version>1.4.1version>dependency>log4j<dependency><groupId>org.slf4jgroupId><artifactId>jcl-over-slf4jartifactId><version>1.5.6version>dependency><dependency><groupId>org.slf4jgroupId><artifactId>slf4j-log4j12artifactId><version>1.7.21version>dependency><dependency><groupId>log4jgroupId><artifactId>log4jartifactId><version>1.2.12version>dependency>