首页 > 编程技术 > html

使用spring拦截器实现日志管理实例

发布时间:2017-7-6 23:23

本文介绍了使用spring拦截器实现日志管理实例的教程,非常实用,有兴趣的同学可以参考一下本文

使用HandlerInterceptor拦截器,可以拦截请求,实现通用的日志管理操作

 一、添加拦截器类

在"src/main/java"代码文件夹的"org.xs.demo1"的包下新建"LogInterceptor.java"类:

 

 代码如下 复制代码

packageorg.xs.demo1;

 

importjava.text.SimpleDateFormat;

 

importjavax.servlet.http.HttpServletRequest;

 

importjavax.servlet.http.HttpServletResponse;

 

importorg.slf4j.Logger;

 

importorg.slf4j.LoggerFactory;

 

importorg.springframework.core.NamedThreadLocal;

 

importorg.springframework.web.servlet.HandlerInterceptor;

 

importorg.springframework.web.servlet.ModelAndView;

 

/**

 

 * 日志拦截器

 

 * @author ThinkGem

 

 */

 

publicclassLogInterceptorimplementsHandlerInterceptor {

  privatefinalLogger log = LoggerFactory.getLogger(getClass().getName());

 

  privatestaticfinalThreadLocal<Long> startTimeThreadLocal =newNamedThreadLocal<Long>("ThreadLocal StartTime");

  /**

 

   * 预处理

 

   */

 

  @Override

 

  publicbooleanpreHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throwsException {

 

      

 

    longbeginTime = System.currentTimeMillis();//开始时间

 

    startTimeThreadLocal.set(beginTime);//线程绑定变量(该数据只有当前请求的线程可见)

 

    log.info("开始计时: {}",newSimpleDateFormat("hh:mm:ss.SSS").format(beginTime));

 

      

 

    returntrue;

 

  }

 

  /**

 

   * 返回处理

 

   */

 

  @Override

 

  publicvoidpostHandle(HttpServletRequest  request, HttpServletResponse response, Object handler, ModelAndView  modelAndView)throwsException {

 

    if(modelAndView !=null){

 

      log.info("ViewName: "+ modelAndView.getViewName());

 

    }

 

  }

 

  /**

 

   * 后处理

 

   */

 

  @Override

 

  publicvoidafterCompletion(HttpServletRequest  request, HttpServletResponse response, Object handler, Exception  ex)throwsException {

 

    // 保存日志

 

    //LogUtils.saveLog(request, handler, ex, null);    

 

    // 输出日志信息

 

    log.info("访问地址:"+ request.getRequestURI() +",执行方式:"+ request.getMethod());

 

    longbeginTime = startTimeThreadLocal.get();//得到线程绑定的局部变量(开始时间)

 

    longendTime = System.currentTimeMillis();//结束时间

 

    log.info("计时结束:{}",newSimpleDateFormat("hh:mm:ss.SSS").format(endTime));

 

  }

}

 

二、修改配置文件

修改spring-mvc.xml件,加入:

 

 代码如下 复制代码

<!-- 拦截器配置 -->

 

<mvc:interceptors>

 

  <mvc:interceptor>

 

    <mvc:mappingpath="/**"/>

 

    <beanclass="org.xs.demo1.LogInterceptor"/>

 

  </mvc:interceptor>

 

</mvc:interceptors>

 

三、运行测试

访问"http://localhost:8080/demo1/hello/list2"地址

可以看到拦截器中输出的日志信息了

本文介绍了比较常用的几个正则表达式匹配数字,非常实用,有需要的同学可以参考一下

正则表达式用于字符串处理、表单验证等场合,实用高效。现将一些常用的表达式收集于此,以备不时之需。

匹配中文字符的正则表达式: [\u4e00-\u9fa5]

评注:匹配中文还真是个头疼的事,有了这个表达式就好办了

匹配双字节字符(包括汉字在内):[^\x00-\xff]

评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)

匹配空白行的正则表达式:\n\s*\r

评注:可以用来删除空白行

匹配HTML标记的正则表达式:<(\s*?)[^>]*>.*?|<.*?>

评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力

匹配首尾空白字符的正则表达式:^\s*|\s*$

评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式

匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

评注:表单验证时很实用

匹配网址URL的正则表达式:[a-zA-z]+://[^\s]*

评注:网上流传的版本功能很有限,上面这个基本可以满足需求

匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$

评注:表单验证时很实用

匹配国内电话号码:\d{3}-\d{8}|\d{4}-\d{7}

评注:匹配形式如 0511-4405222 或 021-87888822

匹配腾讯QQ号:[1-9][0-9]{4,}

评注:腾讯QQ号从10000开始

匹配中国邮政编码:[1-9]\d{5}(?!\d)

评注:中国邮政编码为6位数字

匹配身份证:\d{15}|\d{18}

评注:中国的身份证为15位或18位

匹配ip地址:\d+\.\d+\.\d+\.\d+

评注:提取ip地址时有用

匹配特定数字:

^[1-9]\d*$    //匹配正整数
^-[1-9]\d*$   //匹配负整数
^-?[1-9]\d*$   //匹配整数
^[1-9]\d*|0$  //匹配非负整数(正整数 + 0)
^-[1-9]\d*|0$   //匹配非正整数(负整数 + 0)
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$   //匹配正浮点数
^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$  //匹配负浮点数
^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$  //匹配浮点数
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$   //匹配非负浮点数(正浮点数 + 0)
^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$  //匹配非正浮点数(负浮点数 + 0)

评注:处理大量数据时有用,具体应用时注意修正

匹配特定字符串:

^[A-Za-z]+$  //匹配由26个英文字母组成的字符串
^[A-Z]+$  //匹配由26个英文字母的大写组成的字符串
^[a-z]+$  //匹配由26个英文字母的小写组成的字符串
^[A-Za-z0-9]+$  //匹配由数字和26个英文字母组成的字符串
^\w+$  //匹配由数字、26个英文字母或者下划线组成的字符串

小编给大家推荐的这篇文章介绍了简单谈谈OpenStack中的网络隔离的教程,非常有用,不会的同学可以看看

前言

最近,关于xx公有云的用户网络,由于隔离问题引发安全讨论,大家顿时对啥“经典网络”、“VPC”等概念兴趣大增,大家的热议中多次提到AWS的VPC,亚马逊的AWS怎么搞的,我们不得而知,但是我们可以聊聊OpenStack的,毕竟它一直在模仿AWS嘛;

“隔离”啥

首先,我们先搞清楚,所谓“隔离”,到底是在“隔”什么;

我们知道,计算机网络,是分层实现的,不同协议工作在不同层,这些层的设计、制定都有国际标准,按着OSI的分层模型,共有七个层,大家在讨论的隔离,通常指的是第2层,也叫“数据链路层”;

数据链路层的网络包,也叫“帧”,我们常说的网卡的MAC地址,就是帧的地址,MAC,其实是“媒体访问控制”(media access control)的简称,这是数据链路层的一个子层;

那为什么要在这个二层上搞隔离呢?

因为二层的帧,其中一些帧的地址是广播地址,在同一个二层的设备都可以、也必须接收这些帧,交换机一般认为工作在二层,对这些广播包,也都要转发,所以二层通常被称为一个“广播域”,这就好比大家在一个教室里,都能互相看到,除非分隔到不同的教室;

OpenStack的玩法

openstack的neutron负责为虚拟机提供网络,而且openstack是假设多租户的,那多租户之间的隔离问题,它当然要提供支持,下面我们就看一下neutron是怎么实现的;

平坦网络

neutron中创建的网络是有“type”的,其中最基础的一种type就是“flat”,顾名思义,“平坦”就是指都在一个空间下,也就是没有做二层上的隔离,虚拟机都在同一个二层,同一个广播域;

从网上找了个示意图:

这种”平坦“的大二层网络,虽然实现、管理相对简单,但也会有诸多问题,除了安全方面,还有广播风暴等问题;

单个大二层网络,就好比整个学校的人都在一个大礼堂,大家都能看到,而且万一谁得了传染病,大家都被传染,要想隔离,可以把人分散到各个教室;

VLAN隔离网络

neutron中创建”vlan“这种类型的网络,就是主要使用的二层隔离方案,VLAN(虚拟局域网)本身就是交换机广泛使用的二层隔离技术;

示意图大概这样:

这就好比把整个学校的人,从大礼堂,分隔到了不同的教室,同一个教室的人互相可见,不同教室的人不可见;

但这种方案也有一定的局限性,首先管理相对麻烦,需要配合设置物理交换机,另外VLAN的可用数量有限制,VLAN的ID号仅有四千多个,我们假设每个租户分配1个VLAN,那最多也就能支持四千多个租户;

OverLay网络

overlay(覆盖)网络,所谓”覆盖“,大体上指”在一层上面覆盖另一层,也可以说是用一层载着另一层移动“,VXLAN是最常见的协议,它是把虚拟机的二层的帧,在宿主机上用UDP包裹起来,然后以宿主机的IP,必要的话,经过3层的路由,到达目的宿主机,然后再解封,把内包裹的二层帧,输送给目的虚拟机;

有点抽象?我们先看看VXLAN的包结构,就知道”包裹“是啥意思了:

那个”Inner Frame“就是被包裹的虚拟机的二层的包;

最终封装完的包,外层的源IP、目的IP地址,都是宿主机的,所以只要宿主机之间互通(3层可达),被封装的内层帧就可以被运输:

那这种方案有什么优点呢?

主要的:

vxlan的范围足够大,一千六百多万,租户随便用  因为是完全隔离的,租户可以随意定义自己的网络,哪怕和其他租户的IP段重叠都没有关系,比如上图中,租户A的网络,与租户B的网络  如果通过一定技术实现支持3层路由器,租户可以将自己的网络,随意组织自己的网络拓扑,比如上图中,租户A的两个网络,连接到一个路由器(可以是虚拟的)上

关于上面提的第三点,在neutron中大概是这样的:

VPC

最后,那到底啥是VPC呢?

很明确的告诉你,上面这个图就是VPC!

VPC(virtual private cloud),不是个技术专有名词,而是亚马逊AWS创造的一个产品层面的名词;

租户网络彻底隔离、IP段都能重叠、路由器、网络拓扑都能由自己定义,这还不是”虚拟私有云“吗!

本篇文章为大家分享了网站建设的步骤和流程,很值得看一看的,有需要的朋友就来参考一下吧。

想要建设好一个网站,有很多小细节需要注意,只有把这些小细节做好了,你才建设出来一个完美的网站。那么这个网站建设的流程或者步骤是怎么样的呢?

第一、域名空间

想要建设一个网站首先就是要要有一个空间和一个域名,否则你的网站没有空间放置,并且如果没有域名。那么你的网站就没有任何的意义。

1、域名的选择要谨慎,因为这很有可能会影响到你的网站是否会受到欢迎。尽量选择国际上通用的域名,比如.com之类,这样比较容易被别人记住。另外一点,就是网站的域名要与这个网站的内容有关,最好是这个网站名称的缩写,如果是一个英文单词是最好的,因为这样容易被别人记住,但是如果不能凑成一个英文单词,就用拼音的缩写代替,总之一切要以简单容易记并且可以突出网站主题为主。

2、虚拟空间也是需要的,因为你的网站建设好之后需要一个放置的空间,这个空间是虚拟的。

第二、规划设计

前期准备好之后就需要规划网站了,首先你要清楚自己想要建设一个什么样的网站,并且建设这个网站的目的是什么,只有这样才能着手去准备。另外把建设这个网站需要用到的一些素材要提前准备好,比如一些图片素材。

第三、网站建设

规划好之后就要正式的建设了,网站要分为前台和后台这两个部分。前台就是接待客户的地方,所以在建设这个时候要注意页面的整洁性,并且最好是简明扼要,也就是说让来访的客户第一眼就知道这个网站是做什么的,并且页面要有一定的趣味性,这样才可以吸引客户的兴趣。在建设后台的时候要编写程序,在编写的时候要注意客户的需求,一切从客户的角度出发。

基本上做完以上几点一个网站的雏形就形成了,并且这个网站可以推入市场,只需要后期宣传推广即可。但是在建设的过程中始终不能忘的一点就是从客户的角度出发。

标签:[!--infotagslink--]

您可能感兴趣的文章: