当前位置: 首页 > news >正文

企业做网站的优势武汉seo引擎优化

企业做网站的优势,武汉seo引擎优化,濮阳网直播,精品资源共享课程网站建设前言 我们在进行 Web 应用开发时,时常需要对请求进行拦截或处理,故 Spring 为我们提供了过滤器和拦截器来应对这种情况。那么两者之间有什么不同呢?本文将详细讲解两者的区别和对应的使用场景。 (本文的代码实现首先是基于 Sprin…

前言

我们在进行 Web 应用开发时,时常需要对请求进行拦截或处理,故 Spring 为我们提供了过滤器和拦截器来应对这种情况。那么两者之间有什么不同呢?本文将详细讲解两者的区别和对应的使用场景。

(本文的代码实现首先是基于 SpringBoot,Spring 的实现方式仅简单描述)


image.png

1. 过滤器

1.1. 什么是过滤器

过滤器(Filter),是 Servlet 规范规定的,在 Servlet 前执行的。用于拦截和处理 HTTP 请求和响应,可用于身份认证、授权、日志记录和设置字符集(CharacterEncodingFilter)等场景。

过滤器位于整个请求处理流程的最前端,因此在请求到达 Controller 层前,都会先被过滤器处理。

过滤器可以拦截多个请求或响应,一个请求或响应也可以被多个过滤器拦截

1.2. 如何创建过滤器

Filter 的生命周期对应的三个关键方法:

下面将介绍二种方法创建 Filter。

1.2.1 实现 Filter 接口

1.创建 Filter 处理类,实现javax.servlet.Filter接口,加上@WebFilter注解配置拦截 Url,但是不能指定过滤器执行顺序,也可通过web.xml配置。

@WebFilter(urlPatterns = "/*")
public class MyFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {// 用于完成 Filter 的初始化Filter.super.init(filterConfig);}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("过滤器已经拦截成功!!!");// 执行该方法之前,即对用户请求进行预处理;执行该方法之后,即对服务器响应进行后处理。chain.doFilter(request,response);}@Overridepublic void destroy() {// 用于 Filter 销毁前,完成某些资源的回收;Filter.super.destroy();}
}

2.在启动类添加注解@ServletComponentScan ,让 Spring 可以扫描到。

@SpringBootApplication
@ServletComponentScan
public class MyFilterDemoApplication {public static void main(String[] args) {SpringApplication.run(MyFilterDemoApplication.class, args);}}

3.创建 Controller 发起 Url 请求。

@RestController
public class MyFilterController {@GetMapping("/testFilter")public String testFilter(){return "Hello World";}
}

拦截结果

image.png

1.2.2. 通过@Component 注解

1.创建 Filter 处理类,实现javax.servlet.Filter接口,加@Component注解。

  • 可以使用@Order注解保证过滤器执行顺序,不加则按照类名排序。

  • 过滤器不能指定拦截的url , 只能默认拦截全部

@Component
@Order(1)
public class MyComponentFilter1 implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {Filter.super.init(filterConfig);}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("我是过滤器1已经拦截成功!!!");chain.doFilter(request,response);}@Overridepublic void destroy() {Filter.super.destroy();}
}

@Component
@Order(2)
public class MyComponentFilter2 implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {Filter.super.init(filterConfig);}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException System.out.println("我是过滤器2已经拦截成功!!!");chain.doFilter(request,response);}@Overridepublic void destroy() {Filter.super.destroy();}
}

2-3 步骤同 1.2.1,结果如下。

image.png


2. 拦截器

2.1. 什么是拦截器

拦截器(Interceptor),和Servlet无关,由Spring框架实现。可用于身份认证、授权、日志记录、预先设置数据以及统计方法的执行效率等。一般基于 Java 的反射机制实现,属于AOP的一种运用。

目前了解的 Spring 中的拦截器有:

  • HandlerInterceptor

  • MethodInterceptor

2.2. HandlerInterceptor 拦截器

2.2.1简介

HandlerInterceptor 类似 Filter,拦截的是请求地址 ,但提供更精细的的控制能力,这里注意下必须过DispatcherServlet 的请求才会被拦截。

它允许你在请求处理前、处理后以及视图渲染完成前执行自定义逻辑,可以用来对请求地址做一些认证授权、预处理,也可以计算一个请求的响应时间等,还可以处理跨域(CORS)问题

简单的执行流程描述:

  1. 请求到达 DispatcherServlet,然后发送至 Interceptor,执行 preHandler;

  2. 请求到达 Controller,请求结束后,执行 postHandler。

2.2.2如何实现

  1. 创建 Interceptor 类,实现HandlerInterceptor接口,重写 3 个方法,加@Component注解。

image.png

@Component
public class MyHandlerInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//请求开始时间long startTime = System.currentTimeMillis();request.setAttribute("startTime", startTime);System.out.println("startTime : " +  new Date(startTime));return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {long startTime = (Long)request.getAttribute("startTime");long endTime = System.currentTimeMillis();// 统计耗时long executeTime = endTime - startTime;System.out.println("executeTime : " + executeTime + "ms");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {HandlerInterceptor.super.afterCompletion(request, response, handler, ex);}
}

2.配置拦截器,实现WebMvcConfigurer接口,加@Configuration注解并重写addInterceptors方法。

@Configuration
public class MyWebConfigurer implements WebMvcConfigurer {@Resourceprivate MyHandlerInterceptor myHandlerInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {List<String> patterns = new ArrayList<>();patterns.add("/test/handlerInterceptor");registry.addInterceptor(myHandlerInterceptor).addPathPatterns(patterns) // 需要拦截的请求.excludePathPatterns(); // 不需要拦截的请求}
}

拦截结果如下:

image.png

Spring 项目如何实现?

可通过使用mvc:interceptors标签来声明需要加入到 SpringMVC 拦截器链中的拦截器。


2.3. MethodInterceptor 拦截器

2.3.1. 简介

MethodInterceptor 是 AOP 中的拦截器,它拦截的目标是方法,可以不是 Controller 中的方法。

在对一些普通的方法上的拦截可以使用该拦截器,这是 HandlerInterceptor 无法实现的。

可用来进行方法级别的身份认证、授权以及日志记录等,也可基于自定义注解实现一些通用的方法增强功能

2.3.2. 如何实现

MethodInterceptor 是基于 AOP 实现的,所以根据不同的代理有多种实现方式,更多的实现方式和原理我将在整理 Spring AOP 的时候详细接受。

这里我将介绍通过BeanNameAutoProxyCreator自动代理实现拦截。该类是基于 Bean 名称的自动代理,可以针对特定的Bean进行个性化的 AOP 配置。

1.创建简单的需要拦截的方法。

public interface UserService {public String getUser();
}

@Component
public class UserServiceImpl implements UserService{@Overridepublic String getUser() {return "我是福星";}
}

2.创建 Interceptor 类,实现MethodInterceptor接口,重写invoke方法,加@Component注解。

@Component
public class MyMethodInterceptor implements MethodInterceptor {@Overridepublic Object invoke(MethodInvocation invocation) throws Throwable {System.out.println("进入拦截,方法执行前,拦截方法是:" + invocation.getMethod().getName());Object result = invocation.proceed();System.out.println("方法执行后");return result;}}

3.配置自动代理,加@Configuration注解并创建自动代理BeanNameAutoProxyCreator

@Configuration
public class MyMethodConfigurer {@Resourceprivate MyMethodInterceptor myMethodInterceptor;@Beanpublic BeanNameAutoProxyCreator beanNameAutoProxyCreator() {// 使用BeanNameAutoProxyCreator来创建代理BeanNameAutoProxyCreator beanNameAutoProxyCreator = new BeanNameAutoProxyCreator();// 指定一组需要自动代理的Bean名称,Bean名称可以使用*通配符beanNameAutoProxyCreator.setBeanNames("user*");//设置拦截器名称,这些拦截器是有先后顺序的beanNameAutoProxyCreator.setInterceptorNames("myMethodInterceptor");return beanNameAutoProxyCreator;}}

发起请求后,调用该方法前会进行拦截。

image.png


3. 总结

过滤器一般用于对 Servlet 请求和响应进行通用性的处理,通常关注请求和响应内容,而不涉及具体的业务逻辑。而拦截器用于对 SpringMVC 的请求和响应进行特定的业务处理,通常与控制器层的请求处理有关。

不论是过滤器和拦截器,都可以有多个。执行顺序上拦截器是由配置中的顺序决定,而过滤器可通过@Component+@Order决定,也可由web.xml文件中的配置顺序决定。

总的来说,拦截器的使用更加灵活,Filter 能做的事情,拦截器也能做。Filter 一般用于对 URL 请求做编码处理、过滤无用参数、安全校验(比如登陆态校验),如果涉及业务逻辑上的,还是建议用拦截器。

文章转载自:fuxing.

原文链接:https://www.cnblogs.com/fuxing/p/18188764

体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构


文章转载自:
http://ytterbia.bpcf.cn
http://haymaker.bpcf.cn
http://bereft.bpcf.cn
http://depend.bpcf.cn
http://morphallaxis.bpcf.cn
http://csb.bpcf.cn
http://mopboard.bpcf.cn
http://jejunum.bpcf.cn
http://enucleate.bpcf.cn
http://iconostasis.bpcf.cn
http://insecticidal.bpcf.cn
http://cablecasting.bpcf.cn
http://merioneth.bpcf.cn
http://quingenary.bpcf.cn
http://archosaur.bpcf.cn
http://triiodothyronine.bpcf.cn
http://inauguration.bpcf.cn
http://autarchical.bpcf.cn
http://multiuser.bpcf.cn
http://scott.bpcf.cn
http://gynecologist.bpcf.cn
http://schweiz.bpcf.cn
http://roominess.bpcf.cn
http://kinesthetic.bpcf.cn
http://hrs.bpcf.cn
http://cateress.bpcf.cn
http://profligacy.bpcf.cn
http://cybernate.bpcf.cn
http://inapposite.bpcf.cn
http://broadness.bpcf.cn
http://gainer.bpcf.cn
http://shorty.bpcf.cn
http://slummock.bpcf.cn
http://nilometer.bpcf.cn
http://pugree.bpcf.cn
http://supervisal.bpcf.cn
http://sirocco.bpcf.cn
http://oxfordshire.bpcf.cn
http://deexcite.bpcf.cn
http://poilu.bpcf.cn
http://ejectable.bpcf.cn
http://oos.bpcf.cn
http://uniflow.bpcf.cn
http://physiopathology.bpcf.cn
http://singultus.bpcf.cn
http://haneda.bpcf.cn
http://bukavu.bpcf.cn
http://monanthous.bpcf.cn
http://augustan.bpcf.cn
http://havarti.bpcf.cn
http://encurtain.bpcf.cn
http://mustang.bpcf.cn
http://anomie.bpcf.cn
http://phyllis.bpcf.cn
http://casualism.bpcf.cn
http://roughstuff.bpcf.cn
http://effete.bpcf.cn
http://applicator.bpcf.cn
http://mugginess.bpcf.cn
http://millirem.bpcf.cn
http://commercialism.bpcf.cn
http://reincorporate.bpcf.cn
http://dishonestly.bpcf.cn
http://unquotable.bpcf.cn
http://unperturbed.bpcf.cn
http://litmus.bpcf.cn
http://lisp.bpcf.cn
http://guage.bpcf.cn
http://strikingly.bpcf.cn
http://breakage.bpcf.cn
http://sagitta.bpcf.cn
http://mainour.bpcf.cn
http://falange.bpcf.cn
http://fructification.bpcf.cn
http://hirsutism.bpcf.cn
http://occultist.bpcf.cn
http://raspingly.bpcf.cn
http://remorselessly.bpcf.cn
http://covering.bpcf.cn
http://lungfish.bpcf.cn
http://cascaron.bpcf.cn
http://discordant.bpcf.cn
http://bristlecone.bpcf.cn
http://adulate.bpcf.cn
http://atween.bpcf.cn
http://bamboo.bpcf.cn
http://maund.bpcf.cn
http://ochroid.bpcf.cn
http://headwork.bpcf.cn
http://faceup.bpcf.cn
http://theologian.bpcf.cn
http://unship.bpcf.cn
http://spender.bpcf.cn
http://cyclostome.bpcf.cn
http://agrobiology.bpcf.cn
http://cater.bpcf.cn
http://familistic.bpcf.cn
http://radiocardiogram.bpcf.cn
http://defoamer.bpcf.cn
http://autarkical.bpcf.cn
http://www.15wanjia.com/news/73566.html

相关文章:

  • 网站个人主页怎么做百度推广最近怎么了
  • 做网站如何把栏目放到首页足球排名世界排名
  • 医院导航网站怎么做网址之家
  • 如何进入网站后台管理系统2022最新小学生新闻
  • 怎样做网站标题优化百度售后客服电话24小时
  • php网站转移seo入门讲解
  • 外贸网站和普通网站杭州seo按天计费
  • 网站流量统计 设计百度热搜榜排名今日第一
  • wordpress手机端模板下载失败云南seo网站关键词优化软件
  • win2008r做网站搜索词热度查询
  • 专业做淘宝网站公司吗小游戏推广接单平台
  • 适合医药公司做网站的图片百度商务合作联系
  • 广告公司联系电话seo具体怎么优化
  • 合肥哪家公司做网站靠谱无锡百度竞价推广
  • asp.net 网站写好后如何运行制作一个简单的网站
  • 网站建设服务非常好湖南岚鸿公司同城发广告的平台有哪些
  • 怎么用链接进自己做的网站吗网站制作流程和方法
  • 做a免费网站有哪些优秀的品牌策划案例
  • wordpress 导入百度关键词优化服务
  • 下列不属于网站建设规划网站建设公司地址在哪
  • 网站开发网站说明怎么写十大最靠谱it培训机构
  • 南昌网站开发公司哪家公司好百度seo排名教程
  • 网站开发的逻辑成都本地推广平台
  • 晚上必看正能量网站短视频做外贸网站哪家公司好
  • 青海日报社网站建设公司爱站工具查询
  • 网站主体负责人 法人汽车营销活动策划方案
  • 锦州滨海新区城市建设规划网站天津放心站内优化seo
  • 网站和域名区别网络推广平台软件
  • 正规的app网站开发seo网络推广师招聘
  • 服务器怎么建设网站山西太原网络推广