Atitit.struts排除url 的设计and 原理 自定义filter 排除特定url
Atitit.struts排除url 的设计and 原理 自定义filter 排除特定url
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的更多相关文章
- atitit.ajax上传文件的实现原理 与设计
atitit.ajax上传文件的实现原理 与设计 1. 上传文件的三大难题 1 1.1. 本地预览 1 1.2. 无刷新 1 1.3. 进度显示 1 2. 传统的html4 + ajax 是无法直 ...
- Atitit。Tree文件解析器的原理流程与设计实现 java c# php js
Atitit.Tree文件解析器的原理流程与设计实现 java c# php js 1. 解析原理与流程1 1.1. 判断目录 ,表示服 dirFlagChar = "└├─&quo ...
- Atitit.数据库表的物理存储结构原理与架构设计与实践
Atitit.数据库表的物理存储结构原理与架构设计与实践 1. Oracle和DB2数据库的存储模型如图: 1 1.1. 2. 表数据在块中的存储以及RowId信息3 2. 数据表的物理存储结构 自然 ...
- Atitit.ioc 动态配置文件guice 设计原理
Atitit.ioc 动态配置文件guice 设计原理 1. Bat启动时注入配置文件1 2. ioc调用1 3. Ioc 分发器 配合 apche MethodUtils.invokeStatic ...
- dubbo源码解析五 --- 集群容错架构设计与原理分析
欢迎来我的 Star Followers 后期后继续更新Dubbo别的文章 Dubbo 源码分析系列之一环境搭建 博客园 Dubbo 入门之二 --- 项目结构解析 博客园 Dubbo 源码分析系列之 ...
- Atitit.软件架构高扩展性and兼容性原理与概论实践attilax总结
Atitit.软件架构高扩展性and兼容性原理与概论实践attilax总结 1. 什么是可扩展的应用程序?1 2. 松耦合(ioc)2 3. 接口的思考 2 4. 单一用途&模块化,小粒度化2 ...
- Atitit.在线充值功能的设计
Atitit.在线充值功能的设计 1. 流程1 2. Js sdk api 增加订单1 3. Java api 返回servlet处理1 3.1. 返回网址的本地host测试2 1. 流程 本地增 ...
- Atitit.病毒木马的快速扩散机制原理nio 内存映射MappedByteBuffer
Atitit.病毒木马的快速扩散机制原理nio 内存映射MappedByteBuffer 1. Java NIO(New Input/Output)1 1.1. 变更通知(因为每个事件都需要一个监听者 ...
- Atitit.导出excel功能的设计 与解决方案
Atitit.导出excel功能的设计 与解决方案 1.1. 项目起源于背景1 1.2. Js jquery方案(推荐)jquery.table2excel1 1.3. 服务器方案2 1.4. 详细 ...
随机推荐
- AC日记——Little Elephant and Shifts codeforces 221e
E - Little Elephant and Shifts 思路: 一次函数线段树(疯狂debug): b不断循环左移,判断每次最小的|i-j|,a[i]=b[j]: 仔细观察发现,每个bi移动时, ...
- 2018 ICPC 徐州邀请赛 总结
Day 0 上午在高铁里面,很困但是睡不着…… 中午到矿大报道. 食堂饭菜不错,有西瓜,就是有点辣. 下午热身赛,D题队友想了个假算法……GG. 评测机摸底考试正常进行. 热身赛之后精疲力尽,赶到宾馆 ...
- SpringCloud简介(一)
一.SpringCloud简介 SpringCloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理.服务发现.断路器.路由.负载均衡.微代理.事件总线.全局锁.决策竞选.分布式会话等等 ...
- 扩展欧拉定理【p4139】上帝与集合的正确用法
Description 根据一些书上的记载,上帝的一次失败的创世经历是这样的: 第一天, 上帝创造了一个世界的基本元素,称做"元". 第二天, 上帝创造了一个新的元素,称作&quo ...
- POJ 3171 Cleaning Shifts(DP+zkw线段树)
[题目链接] http://poj.org/problem?id=3171 [题目大意] 给出一些区间和他们的价值,求覆盖一整条线段的最小代价 [题解] 我们发现对区间右端点排序后有dp[r]=min ...
- [TopCoder8600]MagicFingerprint
题目大意: 定义magic(x)为将x按十进制顺序写下来,依次对相邻两个数写下差的绝对值,并去除前导0得到的新数. 若对得到的magic(x)重复进行多次magic,最后会变成一个一位数. 若最后变成 ...
- iOS音频的后台播放 锁屏
初始化AudioSession和基本配置 音频播放器采用的AVPlayer ,在程序启动的时候需要配置AudioSession,AudioSession负责应用音频的设置,比如支不支持后台,打断等等, ...
- 关于MySQL Cluster集群NoOfReplicas参数问题
摘自:http://www.itpub.net/thread-1845295-1-1.html 官方网站上说参数NoOfReplicas的值表示数据的备份份数,例如:NoOfReplicas=2,若在 ...
- What is Mocking?
Mocking is primarily used in unit testing. An object under test may have dependencies on other (comp ...
- [转载] K3漏油器全紫铜替换原硅胶垫教程。标准姿势
首先感谢坛友的支持,全铜套件已经完成了.有的坛友希望有个教程.在这里大体说一下技巧吧.下面步入正题. 声明:本教程图片大部分均来源于给坛友改装时所拍.如有雷同,概不负责!!!声明:本教程图片大部分均来 ...