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

企业网站建设与网页设计学什么的网站建设的公司

企业网站建设与网页设计学什么的,网站建设的公司,建大型购物网站,个人空间网站建设前言 作用 过滤器#xff08;Filter#xff09;#xff1a;当有一堆请求#xff0c;只希望符合预期的请求进来。拦截器#xff08;Interceptor#xff09;#xff1a;想要干涉预期的请求。监听器#xff08;Listener#xff09;#xff1a;想要监听这些请求具体做了…前言 作用 过滤器Filter当有一堆请求只希望符合预期的请求进来。拦截器Interceptor想要干涉预期的请求。监听器Listener想要监听这些请求具体做了什么。 区别 过滤器是在请求进入容器后但还没有进入 Servlet 之前进行预处理的。如下图所示。 拦截器是在请求进入控制器Controller 之前进行预处理的。 虚线内就是过滤器和拦截器的作用范围 过滤器依赖于 Servlet 容器而拦截器依赖于 Spring 的 IoC 容器因此可以通过注入的方式获取容器当中的对象。 监听器用于监听 Web 应用中某些对象的创建、销毁、增加、修改、删除等动作然后做出相应的处理。 过滤器 过滤敏感词汇防止sql注入设置字符编码URL级别的权限访问控制压缩响应信息 过滤器的创建和销毁都由 Web 服务器负责Web 应用程序启动的时候创建过滤器对象为后续的请求过滤做好准备。 过滤器可以有很多个一个个过滤器组合起来就成了 FilterChain也就是过滤器链。 在 Spring 中过滤器都默认继承了 OncePerRequestFilter顾名思义OncePerRequestFilter 的作用就是确保一次请求只通过一次过滤器而不重复执行。 接下来我们通过继承 OncePerRequestFilter 来实现 JWT 登录授权过滤。   public class JwtAuthenticationTokenFilter extends OncePerRequestFilter {Overrideprotected void doFilterInternal(HttpServletRequest request,HttpServletResponse response,FilterChain chain) throws ServletException, IOException {// 从客户端请求中获取 JWTString authHeader request.getHeader(this.tokenHeader);// 该 JWT 是我们规定的格式以 tokenHead 开头if (authHeader ! null authHeader.startsWith(this.tokenHead)) {// The part after Bearer String authToken authHeader.substring(this.tokenHead.length());// 从 JWT 中获取用户名String username jwtTokenUtil.getUserNameFromToken(authToken);LOGGER.info(checking username:{}, username);// SecurityContextHolder 是 SpringSecurity 的一个工具类// 保存应用程序中当前使用人的安全上下文if (username ! null SecurityContextHolder.getContext().getAuthentication() null) {// 根据用户名获取登录用户信息UserDetails userDetails this.userDetailsService.loadUserByUsername(username);// 验证 token 是否过期if (jwtTokenUtil.validateToken(authToken, userDetails)) {// 将登录用户保存到安全上下文中UsernamePasswordAuthenticationToken authentication new UsernamePasswordAuthenticationToken(userDetails,null, userDetails.getAuthorities());authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));SecurityContextHolder.getContext().setAuthentication(authentication);}}}chain.doFilter(request, response);} } 新建一个 Web 项目 codingmore-filter-interceptor-listener。 添加一个过滤器 MyFilter WebFilter(urlPatterns /*, filterName myFilter) public class MyFilter 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 {long start System.currentTimeMillis();chain.doFilter(request,response);System.out.println(Execute cost(System.currentTimeMillis()-start));}Overridepublic void destroy() {Filter.super.destroy();} } WebFilter 注解用于将一个类声明为过滤器urlPatterns 属性用来指定过滤器的 URL 匹配模式filterName 用来定义过滤器的名字。 MyFilter 过滤器的逻辑非常简单重写了 Filter 的三个方法在 doFilter 方法中加入了时间戳的记录。 然后我们在项目入口类上加上 ServletComponentScan 注解这样过滤器就会自动注册。 启动服务器访问任意的 URL。 拦截器 登录验证判断用户是否登录权限验证判断用户是否有权限访问资源如校验token日志记录记录请求操作日志用户ip访问时间等以便统计请求访问量处理cookie、本地化、国际化、主题等性能监控监控请求处理时长等 我们来写一个简单的拦截器 LoggerInterceptor Slf4j public class LoggerInterceptor implements HandlerInterceptor {Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {log.info(preHandle{} .... ,request.getRequestURI());}Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);}Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {HandlerInterceptor.super.afterCompletion(request, response, handler, ex);}}一个拦截器必须实现 HandlerInterceptor 接口preHandle 方法是 Controller 方法调用前执行postHandle  是 Controller 方法正常返回后执行afterCompletion 方法无论 Controller 方法是否抛异常都会执行。 只有 preHandle 返回 true 的话其他两个方法才会执行。 如果 preHandle 返回 false 的话表示不需要调用Controller方法继续处理了通常在认证或者安全检查失败时直接返回错误响应。 再来一个 InterceptorConfig 对拦截器进行配置 /*** ClAssName InterceptorConfig* Description TOOO* Author soshi是神仙* Date 2024/3/27 18:{MINUTE}*/ Configuration public class InterceptorConfig implements WebMvcConfigurer {Overridepublic void addInterceptors(InterceptorRegistry registry) {WebMvcConfigurer.super.addInterceptors(registry);registry.addInterceptor(new LoggerInterceptor()).addPathPatterns(/**);} }Configuration 注解用于定义配置类干掉了以往 Spring 繁琐的 xml 配置文件。 编写一个用于被拦截的控制器 MyInterceptorController RestController RequestMapping(/myinterceptor) public class MyInterceptorController {RequestMapping(/hello)public String hello(){return 测试拦截器的使用;} }RestController 注解相当于 Controller ResponseBody 注解ResponseBody 注解用于将 Controller 方法返回的对象通过适当的 HttpMessageConverter 转换为指定格式后写入到 Response 对象的 body 数据区通常用来返回 JSON 或者 XML 数据返回 JSON 数据的情况比较多。 启动服务器访问 http://localhost:8080/myinterceptor/hello。 在控制台可以看到拦截器中的日志信息 无论是过滤器还是拦截器都属于AOP面向切面编程思想的具体实现。除了这两种实现之外还有另一种更灵活的AOP实现技术即 Aspect在实战项目里你可以看到 Aspect 具体实现。 比如说统一日志切面 WebLogAspect就是用来记录请求信息的。 Aspect Component Order(1) public class WebLogAspect {private static final Logger LOGGER LoggerFactory.getLogger(WebLogAspect.class);Pointcut(execution(public * com.codingmore.controller.*.*(..)))public void webLog() {}Before(webLog())public void doBefore(JoinPoint joinPoint) throws Throwable {}AfterReturning(value webLog(), returning ret)public void doAfterReturning(Object ret) throws Throwable {}Around(webLog())public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {long startTime System.currentTimeMillis();//获取当前请求对象ServletRequestAttributes attributes (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();webLog.setStartTime(startTime);webLog.setUri(request.getRequestURI());logMap.put(parameter,webLog.getParameter());logMap.put(spendTime,webLog.getSpendTime());logMap.put(description,webLog.getDescription());LOGGER.info({}, JSONUtil.parse(webLog));return result;}/*** 根据方法和传入的参数获取请求参数*/private Object getParameter(Method method, Object[] args) {} } 监听器 根据监听对象可以把监听器分为 3 类 ServletContext对应应用 application整个 Web 服务器中只有一个Web 服务器关闭时销毁。可用于数据缓存例如结合redis在Web服务创建时从数据库拉取数据到缓存服务器。HttpSession 对应会话 session在会话建立时创建一端会话关闭时销毁。可用于获取在线用户数量。ServletRequest对应 request客户端发送请求时创建一同创建的还有 response用于封装请求数据在一次请求处理完成时销毁。可用于封装用户信息。 新建一个 MyListener WebListener public class MyListener implements ServletContextListener {Overridepublic void contextInitialized(ServletContextEvent sce) {ServletContextListener.super.contextInitialized(sce);System.out.println(上下文创建);}Overridepublic void contextDestroyed(ServletContextEvent sce) {System.out.println(上下文销毁);}WebListener 注解用于将一个类声明为监听器同样干掉了 web.xml 文件。 ServletContextListener 能够监听整个 Web 应用程序的生命周期。当 Web 应用启动时触发 contextInitialized 方法关闭时触发 contextDestroyed 方法。 在 Intellij IDEA 中重启服务的时候可以在控制台看到如下信息 不过需要注意的是在 Intellij IDEA 中直接关闭进程无法看到 contextDestroyed 被调用的消息。
http://www.zqtcl.cn/news/907615/

相关文章:

  • 资源网站哪个好淄博网站设计
  • 网站建设林晓东网站数据库一般多大
  • 织梦网站后台默认登陆路径网站建设简介淄博
  • 重庆住房建设部网站东莞网站制作多少钱
  • 做胎儿羊水鉴定网站网站管理主要包括哪些内容
  • 公司网站建设应注意网店推广有哪些方法
  • 新网$网站优化企业资源管理软件
  • 甘肃营销型网站制作网页设计流程的图片
  • 厦门成交型网站建设公司今科云平台网站建设
  • 网站推广效果怎样学电商赚钱
  • 企业网站的一般要素包括哪些公司网站建设是什么费用
  • 网站收录说明长沙知名的营销公司
  • 网站开发 业务流程图天津网站排名方案
  • 风雨同舟网站建设小说网站如何做书源
  • h5手机网站建设哪家好广州有什么好玩的地方和风景好
  • 北京哪个网站建设最好怀化网站建设公司
  • 做类似猪八戒网的网站注册一个商标多少钱
  • 怎么提高网站访问速度wordpress怎么备份按在
  • 淘宝网站是谁做的好处wordpress商业授权
  • 淘宝客网站怎么批量采集淘宝商品方维采集淘宝数据思路珠宝类网站建设
  • 重庆网站关键字优化雅布设计中国分公司在哪里
  • 山西做网站费用温州做网站制作
  • 购买域名后 可以做网站么苏州市建设厅网站
  • 网站域名如何查询win7优化配置的方法
  • 免费建网站的服务器佛山城市建设工程有限公司
  • 安溪人做的网站wordpress 单页面 主题
  • 品牌型网站设计创意 国外 网站
  • o2o网站建设包括哪些平面设计作品欣赏
  • 万齐网站建设成都旅游攻略自由行攻略地图
  • 新网做网站流程app下载汅api未满入内