Atitit.struts排除url 的设计and 原理 自定义filter 排除特定url

1.1. 原理流程1

2. Invoke1

3. StrutsX2

1.1. 原理流程

读取struts配置xml文件内容

得到多个regexpress规则,匹配规则与uri

<constant name="struts.action.excludePattern" value="/com.attilax/core/approot_js.jsp,.*\.jsp,/api.jsp,/com\.attilax/.*,/static/.*,/dwr/.*,/dwr/test/.*,/spr/.*,/eqMntRun.jsp,/vod/eqMntRun.jsp,/comm/.*"></constant>

作者:: 绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 ) 汉字名:艾龙,  EMAIL:1466519819@qq.com

转载请注明来源: http://www.cnblogs.com/attilax/

2. Invoke

/wxb_site/src/com/csmy/my/center/filter/RequestFilter.java

if(CTUtils.isEmpty(userInfo) && CTUtils.isEmpty(customerInfo) && isnotExtUrl(request)){//如果全部为空

if ((uri.indexOf("login") == -1) && !uri.equals(path + "/")) {

System.out.println("客户端未登录,请登录...");

PrintWriter out = response.getWriter();

request.setCharacterEncoding("UTF-8");

response.setContentType("text/html;charset=UTF-8");

if (uri.indexOf(".jsp") >= 0) {

System.out.println("截取jsp请求");

response.sendRedirect(path + "/login.htm");

return;

}

}

}

private boolean isnotExtUrl(HttpServletRequest request) {

String f = pathx.classPath() + "/struts.xml";

String pats =StrutsX. get_excludePattern(f);

return !new StrutsX().isUrlExcluded(request, pats);

}

3. StrutsX

/**

* @author attilax 老哇的爪子

@since  o08 j_52_3$

*/

package com.attilax.util;

import com.attilax.core;

import com.attilax.exception.ExUtil;

import com.attilax.io.filex;

import com.attilax.io.pathx;

import static com.attilax.core.*;

import java.util.*;

import java.util.regex.Pattern;

import java.net.*;

import java.io.*;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;

import org.apache.struts2.dispatcher.Dispatcher;

import org.dom4j.DocumentException;

import org.dom4j.DocumentHelper;

import org.dom4j.Element;

import org.dom4j.Node;

/**

* @author attilax 老哇的爪子

* @since o08 j_52_3$

*/

public class StrutsX {

public static void main(String[] args) {

String f = pathx.classPath() + "/struts.xml";

String pats = get_excludePattern(f);

System.out.println(pats);

}

public static String get_excludePattern(String f) {

String t = filex.read(f);

org.dom4j.Document document;

try {

document = DocumentHelper.parseText(t);

Node root = document.getRootElement();

// root.selectNodes(arg0)

List<Element> nodes = ((Element) root).elements("constant");

for (Element e : nodes) {

if (e.attributeValue("name").equals(

"struts.action.excludePattern")) {

return e.attributeValue("value");

}

}

} catch (Exception e1) {

// TODO Auto-generated catch block

e1.printStackTrace();

ExUtil.throwEx(e1);

}

return "";

}

public boolean isUrlExcluded(HttpServletRequest request, String patts) {

List<Pattern> excludedPatterns=buildExcludedPatternsList(patts);

if (excludedPatterns != null) {

String uri =  (request.getRequestURI());

for (Pattern pattern : excludedPatterns) {

if (pattern.matcher(uri).matches()) {

return true;

}

}

}

return false;

}

public boolean isUrlExcluded(HttpServletRequest request,

List<Pattern> excludedPatterns) {

if (excludedPatterns != null) {

String uri =  (request.getRequestURI());

for (Pattern pattern : excludedPatterns) {

if (pattern.matcher(uri).matches()) {

return true;

}

}

}

return false;

}

//public List<Pattern> buildExcludedPatternsList(Dispatcher dispatcher) {

//return buildExcludedPatternsList(dispatcher.getContainer().getInstance(

//String.class, StrutsConstants.STRUTS_ACTION_EXCLUDE_PATTERN));

//}

private List<Pattern> buildExcludedPatternsList(String patterns) {

if (null != patterns && patterns.trim().length() != 0) {

List<Pattern> list = new ArrayList<Pattern>();

String[] tokens = patterns.split(",");

for (String token : tokens) {

list.add(Pattern.compile(token.trim()));

}

return Collections.unmodifiableList(list);

} else {

return null;

}

}

/**

* @author attilax 老哇的爪子

* @since o08 j_52_a

*

* @return

*/

public static HttpServletRequest getReq() {

// attilax 老哇的爪子 j_52_a o08

return ServletActionContext.getRequest();

}

// attilax 老哇的爪子 j_52_3 o08

}

// attilax 老哇的爪子

paip.读取WEB.XML中的参数值总结 - attilax的专栏 - 博客频道 - CSDN.NET.htm

看struts2源码感之一:struts.action.excludePattern属性_「电脑玩物」中文网我们只是「电脑玩物」 -.htm

Atitit.struts排除url 的设计and 原理 自定义filter 排除特定url的更多相关文章

  1. atitit.ajax上传文件的实现原理 与设计

    atitit.ajax上传文件的实现原理 与设计 1. 上传文件的三大难题 1 1.1. 本地预览 1 1.2. 无刷新 1 1.3. 进度显示 1 2.  传统的html4  + ajax 是无法直 ...

  2. Atitit。Tree文件解析器的原理流程与设计实现  java  c# php js

    Atitit.Tree文件解析器的原理流程与设计实现  java  c# php js 1. 解析原理与流程1 1.1. 判断目录  ,表示服  dirFlagChar = "└├─&quo ...

  3. Atitit.数据库表的物理存储结构原理与架构设计与实践

    Atitit.数据库表的物理存储结构原理与架构设计与实践 1. Oracle和DB2数据库的存储模型如图: 1 1.1. 2. 表数据在块中的存储以及RowId信息3 2. 数据表的物理存储结构 自然 ...

  4. Atitit.ioc 动态配置文件guice 设计原理

    Atitit.ioc 动态配置文件guice 设计原理 1. Bat启动时注入配置文件1 2. ioc调用1 3. Ioc 分发器 配合 apche  MethodUtils.invokeStatic ...

  5. dubbo源码解析五 --- 集群容错架构设计与原理分析

    欢迎来我的 Star Followers 后期后继续更新Dubbo别的文章 Dubbo 源码分析系列之一环境搭建 博客园 Dubbo 入门之二 --- 项目结构解析 博客园 Dubbo 源码分析系列之 ...

  6. Atitit.软件架构高扩展性and兼容性原理与概论实践attilax总结

    Atitit.软件架构高扩展性and兼容性原理与概论实践attilax总结 1. 什么是可扩展的应用程序?1 2. 松耦合(ioc)2 3. 接口的思考 2 4. 单一用途&模块化,小粒度化2 ...

  7. Atitit.在线充值功能的设计

    Atitit.在线充值功能的设计 1. 流程1 2. Js sdk api   增加订单1 3. Java api 返回servlet处理1 3.1. 返回网址的本地host测试2 1. 流程 本地增 ...

  8. Atitit.病毒木马的快速扩散机制原理nio 内存映射MappedByteBuffer

    Atitit.病毒木马的快速扩散机制原理nio 内存映射MappedByteBuffer 1. Java NIO(New Input/Output)1 1.1. 变更通知(因为每个事件都需要一个监听者 ...

  9. Atitit.导出excel功能的设计 与解决方案

    Atitit.导出excel功能的设计 与解决方案 1.1. 项目起源于背景1 1.2. Js  jquery方案(推荐)jquery.table2excel1 1.3. 服务器方案2 1.4. 详细 ...

随机推荐

  1. J.U.C并发框架源码阅读(一)AtomicInteger

    基于版本jdk1.7.0_80 java.util.concurrent.atomic.AtomicInteger 代码如下 /* * ORACLE PROPRIETARY/CONFIDENTIAL. ...

  2. Guava源码学习(二)Ordering

    基于版本:Guava 22.0 Wiki:Ordering 0. Ordering简介 Guava的Ordering提供了链式风格的比较器的实现,我们可以用Ordering轻松构建复杂的比较器. 1. ...

  3. 51nod 1090 3个数和为0【二分】

    1090 3个数和为0 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题  收藏  关注 给出一个长度为N的无序数组,数组中的元素为整数,有正有负包括0,并互不相等.从 ...

  4. Python与正则表达式[0] -> re 模块的正则表达式匹配

    正则表达式 / Regular Expression 目录 正则表达式模式 re 模块简介 使用正则表达式进行匹配 正则表达式RE(Regular Expression, Regexp, Regex) ...

  5. [POJ 1935] Journey

    Link: POJ1935 传送门 Solution: 一道吓唬人的水题 注意这是一棵树,两点间仅有唯一的路径! 于是每个“关键点”和起点只有一条路径,想去起点另一棵子树上的节点必须要回到起点 如果必 ...

  6. stack栈和Queue队列

    1.push将对象插入 System.Collections.Generic.Stack<T> 的顶部. Stack st = new Stack(); //栈是先进后出 st.Push( ...

  7. u-boot-2010.3移植到Tiny6410问题总结

    问题1: u-boot-2010.3中nand_spl文件夹的作用:实现从Nandflash启动在编译是会建立几个链接文件,用这几个链接文件生成u-boot-spl-16k.bin nand_spl/ ...

  8. C++多重继承时调用相应的父类函数

    C++中没有super或parent关键字,想要调父类方法,只能使用明确的[父类名称::方法名] 假如要求A和B是C的父类的前提下,要使如下代码能够分别输出A和B的相关信息(虽然这个要求很少遇到... ...

  9. MySQL性能指标及计算方法 等待show processlist

    http://www.cnblogs.com/cyt1153/p/6697847.html http://www.cnblogs.com/cyt1153/tag/mysql/

  10. CRC(16位)多项式为 X16+X15+X2+1

    其对应校验二进制位列为1 1000 0000 0000 0101,可这有17位啊,我怎么和16位信息进行异或啊?是不是不要最高位的1 你没有弄明白crc的意思.这17位后面再添上16个零,然后开始抑或 ...