在我们的项目当中,只要有登录就必定有过滤器拦截器。过滤器主要针对未登录就访问系统页面时进行过滤非法url,判断用户未登录时跳转到登陆页面,当然深入了可以加上不同用户角色只能访问他们所拥有权限的页面。拦截器主要是对一些非法action请求进行拦截。
过滤器(filter)的使用:
- 初始化 init(FilterConfig filterConfig)
- 过滤 doFilter(ServletRequest request, ServletResponse response,FilterChain chain)
- 销毁 destroy()
@WebFilter(urlPatterns = {“/*”}, filterName = “LogCostFilter”)
示例代码:
- urlPatterns 为拦截路径,/* 默认过滤所有(也可过滤html)
- filterName 指过滤器名字
@WebFilter(urlPatterns = {"/*"}, filterName = "LogCostFilter")
public class LogCostFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
//具体,比如:处理若用户未登录,则跳转到登录页
if(XXX) {//如果已登录,不阻止
chain.doFilter(request, response);
return;
}else {
//到登陆页面
}
}
@Override
public void destroy() {
}
}
除此之外还需在启动类添加注解进行扫描:
@ServletComponentScan(basePackages = {"com.yy.qccrm.filter"})
拦截器(Interceptor)的使用
interceptor 的执行顺序大致为:
- 请求到达 DispatcherServlet
- DispatcherServlet 发送至 Interceptor ,执行 preHandle
- 请求达到 Controller
- 请求结束后,postHandle 执行
Spring 中主要通过 HandlerInterceptor 接口来实现请求的拦截,实现 HandlerInterceptor 接口需要实现下面三个方法:
示例代码:
- preHandle() – 在handler执行之前,返回 boolean 值,true 表示继续执行,false 为停止执行并返回。
- postHandle() – 在handler执行之后, 可以在返回之前对返回的结果进行修改
- afterCompletion() – 在请求完全结束后调用,可以用来统计请求耗时等等
public class LoginHandlerIntercepter implements HandlerInterceptor {
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object arg2, Exception arg3)
throws Exception {
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response,
Object handler, ModelAndView modelAndView) throws Exception {
if(response.getStatus()==404){
/404页面....../
}
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object arg2) throws Exception {
HttpSession session = request.getSession();
if(!StringUtils.isEmpty(session.getAttribute("user"))){
return true;
} else{
response.sendRedirect("/login");
return false;
}
}
}
配置类:添加注解@Configuration
示例代码:
- 编写WebAppConfig类继承WebMvcConfigurerAdapter
- registry.addInterceptor(new LoginHandlerIntercepter()).addPathPatterns(“/**”).excludePathPatterns(“/login”,”/logins”) 配置拦截路径和排除特殊不拦截
@Configuration
public class WebAppConfig extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 注册自定义拦截器,添加拦截路径和排除拦截路径
registry.addInterceptor(new LoginHandlerIntercepter()).addPathPatterns("/**")
.excludePathPatterns("/login");
}
}
拦截器和过滤器的区别:
- 拦截器是基于java反射机制的,过滤器是基于函数回调。
- 拦截器不依赖于selvet容器,过滤器依赖于servlet容器(使用过滤器,我们需要从spring容器当中取出Bean对象)。
- 拦截器只能对action请求起作用,过滤器几乎可以对所有请求起作用。
- 在action生命周期中拦截器可以多次调用,过滤器只能在初始化的时候使用一次
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/115855.html