springboot使用过滤器、拦截器

1.过滤器
使用Filter的实现类完成对/filter/*这样的url的来访的数据的过滤。

1.1和之前创建项目一样,只需要一个web组件即可。


image.png

1.2编写controller


image.png

可修改为如下:
1.@RequestMapping(value = “”,method = RequestMethod.GET)表示通过get的方法获取值,get是默认方法,可以省略。
2.在方法上可以直接使用@GetMapping(value = “”)直接可以表示用get方法获取值。


image.png

1.3 过滤器

package com.qianliu.springboot_test.filter;
import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

//将servlet过滤器配置起来
//1.urlPatterns = "/*"表示过滤的url的正则表达式
@Order(1) //多个filter的时候此过滤器的顺序第一
@WebFilter(urlPatterns = "/filter/*", filterName = "SimpleFilter")
public class SimpleFilter implements Filter {
    //获取日志
    private Logger logger = LoggerFactory.getLogger(this.getClass());

    @Override
    public void destroy() {}

    //打印过来的请求的host和address
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterchain)
            throws IOException, ServletException {

        logger.info("Remote Host:"+request.getRemoteHost());
        logger.info("Remote Address:"+request.getRemoteAddr());
        filterchain.doFilter(request, response);
        /*
        //过滤没有登陆的人
        if(request.getParameter("user")!=null){
            filterchain.doFilter(request, response);
        }
        */
    }

    @Override
    public void init(FilterConfig filterconfig) throws ServletException {}
}

1.4配置好servlet扫描器


image.png

1.5测试


image.png

结果正确(图片中的interceptor和configuration都是拦截器中的代码,这张图的拦截器代码并没有完成时的截图):

2.拦截器
利用拦截器来实现对进入"/interceptor/*"这个url下的拦截,如果进入的时候session里面有“name”,那么就放行,并打印出“name”。

2.1 定义拦截器

package com.qianliu.springboot_test.interceptor;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

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

@Component //@Component标签相当于配置文件中的<bean id="" class=""/>,以后可以直接放入到@Configuration标注的类中
public class SimpleIntercepter implements HandlerInterceptor {
    //获取日志
    private Logger logger = LoggerFactory.getLogger(this.getClass());

    /*
     * 进入controller层之前拦截请求
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //不是含有"/interceptor"的链接不进行拦截
        if(!request.getRequestURI().contains("/interceptor")){
            return true;
        }

        //查看session里面是否有"name"的数据
        String name = null;
        if((name = (String) request.getSession().getAttribute("name"))!=null){
            logger.info("user:"+name+"进入网站。。");
            return true;
        }

        return false;
    }

    /*
     * 处理请求完成后视图渲染之前的处理操作
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        logger.info("postHandle..................");
    }

    /*
     * 视图渲染之后的操作
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        logger.info("afterCompletion...............");
    }
}

2.2 springboot2.x注册拦截器的方式

package com.qianliu.springboot_test.utils.configuration;

import com.qianliu.springboot_test.interceptor.SimpleIntercepter;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import javax.annotation.Resource;

/*
 * @author qianliu on 2019/5/16 21:43
 * @Discription:注册SimpleIntercepter拦截器并注册拦截的url
 */
@Configuration //SimpleIntercepter相当于一个Bean,因为它被@Component标注过
public class UserInterceptorAppConfig implements WebMvcConfigurer {
    @Resource
    SimpleIntercepter simpleIntercepter;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(simpleIntercepter).addPathPatterns("/interceptor/*");
    }
}

2.3编写controller


image.png

2.4测试
先在浏览器:http://localhost:8080/filter/xiaoming
再输入:http://localhost:8080/interceptor/xiaoming

image.png

正常进入程序:


image.png

拦截器和过滤器的区别:

1.对于自定义 Controller 的请求分发流程:

Filter 过滤请求处理;
Interceptor 拦截请求处理;
对应的 HandlerAdapter 处理请求;
Interceptor 拦截响应处理;
Interceptor 的最终处理;
Filter 过滤响应处理。
2.机制不同:

Filter 是基于 函数回调的,而 Interceptor 则是基于 Java反射 和 动态代理。
Filter 依赖于 Servlet 容器,而 Interceptor 不依赖于 Servlet 容器。
Filter 对几乎 所有的请求 起作用,而 Interceptor 只对 Controller 对请求起作用。

@Autowired与@Resource用法相似,下面是两者的区别:
(1).@Autowired 与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上;
(2).@Autowired 默认按类型装配,默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设
置它的required属性为false,如:@Autowired(required=false) .如果我们想使用名称装配可以结合 @Qualifier注解进行使用;

3.@Resource(这个注解属于J2EE的),默认安装名称进行装配,名称可以通过name属性进行指定,如果没
有指定name属性,当注解写在字段上时,默认取字段名进行安装名称查找,如果注解写在setter方法上默认取属
性名进行装配。当找不到与名称匹配的bean时才按照类型进行装 配。但是需要注意的是,如果name属性一旦指
定,就只会按照名称进行装配。

推荐使用@Resource注解在字段上,这样就不用写setter方法了.并且这个注解是属于J2EE的,减少了与Spring
的耦合,这样代码看起就比较优雅 。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容