过滤器Fileter
快速入门
@WebFilter(urlPatterns = "/*")//此处定义拦截哪些请求,/*代表全部(正则表达式)
public class DemoFilter implements Filter {
@Override//初始化方法,只调用一次
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
@Override//每次拦截都会调用,会调用多次
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("拦截到请求");
chain.doFilter(request,response);//放行:方法传入的参数(请求对象和响应对象)
}
@Override//销毁方法,只调用一次
public void destroy() {
Filter.super.destroy();
}
}
详解(执行流程/拦截路径/过滤器链)
执行流程:请求进入过滤器以后,首先执行放行前的操作->放行->放行后访问web资源->回到filter执行放行后操作
拦截路径:
@WebFilter(urlPatterns = "/*")
过滤器链:
登录校验
拦截器
快速入门
1.定义拦截器,实现HandlerInterceptor
2.配置拦截器
@Component
public class CheckInterceptor implements HandlerInterceptor {
@Override//目标资源运行前运行,true放行/false不放行
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("放行前-----");
return true;
}
@Override//目标资源运行后运行
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("放行后-----");
}
@Override//视图渲染完毕后运行
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("渲染后-----");
}
}
///
@Configuration//署名这是配置类
public class WebConfig implements WebMvcConfigurer {
@Autowired
private CheckInterceptor checkInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry){
registry.addInterceptor(checkInterceptor).addPathPatterns("/**");//拦截资源的路径
}
}
详解拦截器
不同的路径配置方案
/*代表一级路径,/**代表两级路径
两者区别
登录校验Interceptor
@Slf4j
@RestController
public class LoginController {
@Autowired
private EmpService empService;
@PostMapping("/login")
public Result login(@RequestBody Emp emp){
log.info("员工登录:{}",emp);
Emp e = empService.login(emp);
//登录成功,生成令牌,下发令牌
if(e != null)
{
Map<String,Object> claims = new HashMap<>();
claims.put("id",e.getId());
claims.put("name",e.getName());
claims.put("username",e.getUsername());
//包含当前登录的员工信息
String jwt = JwtUtils.JwtCreator(claims);
return Result.success(jwt);
}
//登录失败,返回错误信息
return Result.error("用户名或密码错误");
}
}