通用过滤器的写法

web.xml:


encoding-filter
com.demo.ParameterCharacterFilter

encoding
utf-8


contentType
text/html;charset=utf-8



resetEnable
false



allow
127.0.0.1



deny




filterurl

/lnb/test,/test




encoding-filter
/*

现在有 @WebFilter就方便多了,不用再配置xml了。

public class ParameterCharacterFilter implements Filter{
/运行访问IP列表/
public static final String PARAM_NAME_ALLOW = “allow”;

/*限制访问IP列表*/
public static final String  PARAM_NAME_DENY             = "deny";

/*不过滤URL地址*/
public static final String PARAM_NAME_NOURL             = "filterurl";

/*编码字符集*/
public static final String CONFIG_ENCODING                = "encoding";

/*编码类型*/
public static final String CONFIG_CONTENTTYPE            = "contentType";

/*是否启用IP控制*/
public static final String  PARAM_NAME_RESET_ENABLE     = "resetEnable";
private final static String TEMPLATE_PAGE_RESOURCE_PATH = "/template.html";
private boolean             statService;
public String               templatePage;

/**
 * 允许访问IP地址列表
 */
private List<IPRange>       allowList                   = new ArrayList<IPRange>();

/**
 * 禁止访问IP地址列表
 */
private List<IPRange>       denyList                    = new ArrayList<IPRange>();

/**
 * 不过滤URL地址列表
 */
private List<String>         nourlList                    = new ArrayList<String>();

private FilterConfig filterConfig;
private String encoding = "UTF-8";
private String contentType = null;

public void init(FilterConfig filterConfig) throws ServletException {
    this.filterConfig = filterConfig;
    templatePage = TEMPLATE_PAGE_RESOURCE_PATH;

    //读取字符编码
    try {
        String param = this.filterConfig.getInitParameter(CONFIG_ENCODING);
        if(param != null && param.trim().length() != 0){
            encoding = param.trim();
        }
    } catch (Exception e) {
        String msg = "initParameter config error, encoding : " + filterConfig.getInitParameter(CONFIG_ENCODING);
        logger.log(msg, Logger.LEVEL_ERROR);
    }

    //读取编码类型
    try {
        String param = this.filterConfig.getInitParameter(CONFIG_CONTENTTYPE);
        if(param != null && param.trim().length() != 0){
            contentType = param.trim();
        }
    } catch (Exception e) {
        String msg = "initParameter config error, contentType : " + filterConfig.getInitParameter(CONFIG_ENCODING);
        logger.log(msg, Logger.LEVEL_ERROR);
    }

    //读取是否启用状态
    try {
         String param = this.filterConfig.getInitParameter(PARAM_NAME_RESET_ENABLE);
         if (param != null && param.trim().length() != 0) {
             param = param.trim();
             boolean resetEnable = Boolean.parseBoolean(param);
             statService = resetEnable;
         }

    }catch (Exception e) {
        String msg = "initParameter config error, resetEnable : " + this.filterConfig.getInitParameter(PARAM_NAME_RESET_ENABLE);
        logger.log(msg, Logger.LEVEL_ERROR);
    }

    //读取可以访问的IP地址
    try {
        String param = this.filterConfig.getInitParameter(PARAM_NAME_ALLOW);
        if (param != null && param.trim().length() != 0) {
            param = param.trim();
            String[] items = param.split(",");
            for (String item : items) {
                if (item == null || item.length() == 0) {
                    continue;
                }

                IPRange ipRange = new IPRange(item);
                allowList.add(ipRange);
            }
        }
    } catch (Exception e) {
        String msg = "initParameter config error, allow : " + this.filterConfig.getInitParameter(PARAM_NAME_ALLOW);
        logger.log(msg, Logger.LEVEL_ERROR);
    }

    //读取禁止访问IP地址列表
    try {
        String param = this.filterConfig.getInitParameter(PARAM_NAME_DENY);
        if(param != null && param.trim().length() != 0){
            param = param.trim();
            String[] items = param.split(",");
            for(String item : items){
                if(item == null || item.length() == 0){
                    continue;
                }
                IPRange ipRange = new IPRange(item);
                denyList.add(ipRange);
            }
        }
    } catch (Exception e) {
        String msg = "initParameter config error, deny : " + this.filterConfig.getInitParameter(PARAM_NAME_ALLOW);
        logger.log(msg, Logger.LEVEL_ERROR);
    }

    //读取不过滤URL
    try {
        String param = this.filterConfig.getInitParameter(PARAM_NAME_NOURL);
        if(param != null && param.trim().length() != 0){
            param = param.trim();
            String[] items = param.split(",");
            for(String item : items){
                if(item == null || item.length() == 0){
                    continue;
                }
                nourlList.add(item.trim());
            }
        }
    } catch (Exception e) {
        String msg = "initParameter config error, url : " + this.filterConfig.getInitParameter(PARAM_NAME_NOURL);
        logger.log(msg, Logger.LEVEL_ERROR);
    }
}

public boolean isPermittedRequest(HttpServletRequest request) {
    String remoteAddress = request.getRemoteAddr();
    return isPermittedRequest(remoteAddress);
}

/**
 * 是否允许请求
 * @param remoteAddress
 * @return
 */
public boolean isPermittedRequest(String remoteAddress) {
    boolean ipV6 = remoteAddress != null && remoteAddress.indexOf(':') != -1;

    if (ipV6) {
        if (denyList.size() == 0 && allowList.size() == 0) {
            return true;
        }
    }

    IPAddress ipAddress = new IPAddress(remoteAddress);

    for (IPRange range : denyList) {
        if (range.isIPAddressInRange(ipAddress)) {
            return false;
        }
    }

    if (allowList.size() > 0) {
        for (IPRange range : allowList) {
            if (range.isIPAddressInRange(ipAddress)) {
                return true;
            }
        }

        return false;
    }

    return true;
}

/**
 * 验证用户访问URL是否不过滤
 * @param remoteUrl 当前用户访问URL
 * @return 如果不过滤URL列表中存在当前用户访问的URL则返回<code>true</code> 否则返回<code>false</code>
 */
public boolean isFilterUrl(String remoteUrl){
    if(nourlList.size() > 0){
        for(String item : nourlList){
            if(item.equals(remoteUrl)){
                return true;
            }
        }
    }
    return false;
}


public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain filterChain) throws IOException, ServletException {
    request.setCharacterEncoding(encoding);
    response.setContentType(contentType);
    HttpServletRequest req = (HttpServletRequest) request;
    String requestURI = req.getRequestURI();

    if(isFilterUrl(requestURI)){
        logger.log("Don't filter this URI: " + requestURI,Logger.LEVEL_DEBUG);
        filterChain.doFilter(request, response);
        return;
    }

    if(statService){
        //当前访问地址不在未过滤地址列表内

    }

    request = new Request((HttpServletRequest) request);

    filterChain.doFilter(request, response);
}



public void destroy() {
    filterConfig = null;
    encoding = null;
}

public static String stringFilter(String value) {
    // 只允许字母和数字
    // String regEx = "[^a-zA-Z0-9]";
    // 清除掉所有特殊字符
    //String regEx = "[`~!@$&*|''<>?~!@¥%……&*——|【】‘;’。%,?/]";
    String regEx = "'‘;’/";
    Pattern p = Pattern.compile(regEx);
    Matcher m = p.matcher(value);
    return m.replaceAll("").trim();
}


class Request extends HttpServletRequestWrapper {

    @Override
    public String[] getParameterValues(String name) {
        String[] values = super.getParameterValues(name);
        if(values == null)  return null;

        for (int i = 0; i < values.length; i++) {
            if(values[i] == null || "".equals(values[i])){
                continue;
            }

            String checkBefore = values[i];
            String checkAfter = StringUtils.stringFilter(values[i]);
            checkAfter = checkAfter.replaceAll("[^\\u0000-\\uFFFF]", "口");
            log.info("检查请求包含非法字符:"+checkBefore + ", 处理后为:" + checkAfter);
            values[i] = checkAfter;


        }

        return values;
    }

    @Override
    public String getParameter(String name) {
        String p = super.getParameter(name);
        if(p == null)
            return p;
        String value = StringUtils.stringFilter(p);
        return value.replaceAll("[^\\u0000-\\uFFFF]", "口");
    }

    public Request(HttpServletRequest request) {
        super(request);
    }


}

}

分享到 评论

记在新公司的一些感受

时间不等人啊!一眨眼今天是已经在新的公司上班20天了,说说在新公司的感受吧。

公司是一家消费金融公司,发展非常迅猛,重庆作为总部,北京,深圳,成都同时都设有研发中心。公司氛围其实对于我来讲也还是挺习惯的,因为,曾经在IBM见识过比这家公司流程更复杂更正规的例子,所以很迅速就适应了现在的风格。同事之间,感觉也还不错,很友好的,公司里还有不少外籍同事,上周的一个早上,我还和咱们公司一个级别比较高的foriengner聊了聊,虽然感觉到许久未说过的英语有点别扭,但也还是感觉到找回来的希望,另外在团结协作方面也不费劲,即使是各处北京,深圳,重庆多地都没什么问题,这一点我觉得还是挺不错的了。

说说我的工作内容吧,自从进入公司第一天起,就开始了架构之旅,因为又接手了一个新项目,不过好在业务需求已经有人分析得差不多了,已经有比较详细的需求和原型文档。对于我来说,就是技术选型,搭建应用框架,抽象基础通用功能以及带头编写核心业务功能,提供代码模板。虽然我们项目原定6个人,但是实际仅入职了三个人,最后也就两周时间加班加点就把系统开发完成了。当然这足以证明小伙伴们理解能力和适应能力相当快,很迅速就能按照我的框架进行开发工作。截止昨天,新系统已经提请测试,正式进入测试阶段。

对于这次的技术选型,我选择的技术框架:springboot, spring cloud, mybaits,前端:jquery, bootstrap, freemarker,数据库:Mysql, 缓存及队列:Redis cluster; 接下来我还会集成更多的新技术,相较之前的SSM, 又更接近流行一点了,主要原因是硬件条件不再是束缚我的因素了。

另外,我希望,把新项目带上线之后,重心放在人工智能的学习方面,从零开始弥补数学、算法等基础,学习人工智能理论基础知识,再多和内部的架构师们沟通交流,把团队和自己提升得更强。

分享到 评论

读《三板斧-阿里巴巴管理之道》

今天花了一天的时间,把这本书看完了,谈谈我自己的感悟吧。
第一、从这本书中感觉到一个大公司能成功,的确是有一套特别的管理手段
第二、管理是一门非常大的学问,要讲道,要讲哲学
第三、管好一个团队(产品,企业)要用心用情
第四、慈不掌兵,义不长财;对我自己是一个警钟

通过读了本书之后,自己领悟到了自己在管理过程中,有些值得小欣慰的地方,也有些做得不够好需要改进的地方,容我好好总结一下不足,列出改进方案去吧…

分享到 评论

eclipse打包jar,调用其中类的方法参数名不显示的问题解决

问题场景

在我项目中,我把框架基类都封装在一个jar包中,在项目中,通过引用此jar文件,调用其中的方法,但是在eclipse开发环境中,鼠标指向该方法时,参数名以 arg0, arg1 …方式显示,这样显然在开发过程不是很方便,因为参数名是有含义的,见名知义,降低不必要的沟通成本。

解决办法

如果是通过eclipse直接export方法生成jar文件,那么,修改eclipse的其中一个设置:

  1. Preferences -> Java -> Compiler, “Store information about method parameters”, 勾选上这一项
  2. eclipse会重新编译项目,验证项目等工作
  3. 重新导出jar
  4. 把新jar文件替换进项目
  5. 重启eclipse,再打开项目,就能正常看到jar中定义的方法参数的原名了


OK,大功告成。

分享到 评论

elk安装过程

目的

使用ELK集中管理日志,如集群应用中所有节点的日志放在一起查看,并按日志级别分别过滤,实时监控错误日志,以及对业务一些数据进行分析,如实时车辆位置展示等等。

版本选择

作为尝鲜者,选择官网最新版本来尝试

  • ElasticSearch5.4.0
  • Filebeat5.4.0
  • Logstash5.4.0
  • Kibana5.4.0
  • Redis3.2.9
  • x-pack
  • nginx1.12.0
  • Centos7.3 x64


各组件的简略架构图

查看更多

分享到 评论