struts2拦截器添加及xss攻击的处理
来源:互联网 发布:网络技术部工作流程 编辑:程序博客网 时间:2024/06/07 00:50
struts2拦截器添加及xss攻击的处理
先在struts2.xml中添加拦截路径。
<package name="base" extends="struts-default,json-default" ><!-- 给文本编辑器配置的bean以及constant --> <!--拦截器--> <interceptors> <interceptor name="LoginInterceptor" class="com.spark.tempo.urm.web.interceptor.LoginInterceptor"> <!--方法不拦截--> <param name="excludeMethods">login</param> </interceptor> <interceptor-stack name="myDefault"> <interceptor-ref name="defaultStack"/> <interceptor-ref name="LoginInterceptor"/> </interceptor-stack> </interceptors> <default-interceptor-ref name="myDefault"/> <global-results> <result name="login">/mgrIndex.jsp</result> </global-results></package>然后在需要拦截的action中添加注解:
@ParentPackage(value="base")如果action中都有继续统一的BaseAction则可以在BaseAction中写入此注解如:
@ParentPackage(value="base")public class BaseAction extends WebApplicationObjectSupport implements Action {
在添加拦截器类及方法:
我做这拦截添加了防止页面中传入的xss攻击代码
2、拦截器要继承MethodFilterInterceptor类这样xml中的<param name="excludeMethods">login</param>不拦截的方法才能生效不然不生效别怪我哟。
public class LoginInterceptor extends MethodFilterInterceptor { @Resource private IBaseService baseService; private HttpServletRequest request; @Override public String doIntercept(ActionInvocation acation) throws Exception { String actionName = acation.getInvocationContext().getName();//获取action方法名 Map<String,Object> parameters = acation.getInvocationContext().getParameters(); request = ServletActionContext.getRequest(); ActionContext ac = acation.getInvocationContext(); ValueStack stack = ac.getValueStack(); for(Map.Entry<String,Object> map : parameters.entrySet()){ Object[] obj = (Object[])map.getValue();//获取传入的参数值是否有非法,xss攻击// System.out.println("参数名:"+map.getKey()+" 参数值:"+obj[0].toString());// System.out.println("处理参数名:"+map.getKey()+" 处理后参数值:"+XssHttpServletRequestWrapper.xssEncode(obj[0].toString())); //action参数中添加处理后的值,防止xss攻击将处理后的参数重新set到action值中 stack.setValue(map.getKey(), XssHttpServletRequestWrapper.xssEncode(obj[0].toString())); } User user = (User) ServletActionContext.getRequest().getSession().getAttribute(SysContextParam.SessionAttribute.SESSION_CURR_USER); //用户已登陆,添加操作日志 if(user != null){ //获取访问者ip String ip = request.getHeader("x-forwarded-for"); if (ip == null || ip.length() == 0) { ip = request.getRemoteAddr(); } //添加日志: String logSql = "INSERT INTO t_custom_manager_log (id, operator, create_date, operate_url, ip,operate_project) VALUES(?, ?, ?, ?, ? ,?)"; baseService.executeUpdateByOrigSQL(logSql, new Object[]{null,user.getName(),new Date(),request.getServletPath(),ip,"1"}); return acation.invoke(); }else{ return "login"; } }}
添加防拦截的xss攻击类
public class XssHttpServletRequestWrapper { /** * 将容易引起xss漏洞的半角字符直接替换成全角字符 * * @param s * @return */ public static String xssEncode(String s) { if (s == null || s.isEmpty()) { return s; } StringBuilder sb = new StringBuilder(s.length() + 16); for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); switch (c) { case '>': sb.append('>');// 全角大于号 break; case '<': sb.append('<');// 全角小于号 break;// case '\'':// sb.append('‘');// 全角单引号// break;// case '\"':// sb.append('“');// 全角双引号// break; case '(': sb.append('(');// 全角 break; case ')': sb.append(')');// 全角 break; case '&': sb.append('&');// 全角 break; case '\\': sb.append('\');// 全角斜线 break; case '#': sb.append('#');// 全角井号 break; case '%': // < 字符的 URL 编码形式表示的 ASCII 字符(十六进制格式) 是: %3c processUrlEncoder(sb, s, i); break; default: sb.append(c); break; } } return sb.toString(); } private static void processUrlEncoder(StringBuilder sb, String s, int index) { if (s.length() >= index + 2) { if (s.charAt(index + 1) == '3' && (s.charAt(index + 2) == 'c' || s.charAt(index + 2) == 'C')) { // %3c, %3C sb.append('<'); return; } if (s.charAt(index + 1) == '6' && s.charAt(index + 2) == '0') { // %3c (0x3c=60) sb.append('<'); return; } if (s.charAt(index + 1) == '3' && (s.charAt(index + 2) == 'e' || s.charAt(index + 2) == 'E')) { // %3e, %3E sb.append('>'); return; } if (s.charAt(index + 1) == '6' && s.charAt(index + 2) == '2') { // %3e (0x3e=62) sb.append('>'); return; } } sb.append(s.charAt(index)); }}
好,搞完收工。
还有就是拦截到返回的参数:login他会返回到struts2中xml
<global-results> <result name="login">/mgrIndex.jsp</result> </global-results>获取返回的login到mgrIndex.jsp路径中,这我是jsp页面。也可以根据自己的需要添加
阅读全文
0 0
- struts2拦截器添加及xss攻击的处理
- Struts2 Xss 攻击预防的处理
- 一个简单XSS攻击示例及处理
- XSS攻击常识及常见的XSS攻击脚本汇总
- XSS攻击常识及常见的XSS攻击脚本汇总
- XSS攻击常识及常见的XSS攻击脚本汇总
- Spring MVC通过拦截器处理sql注入、跨站XSS攻击风险(jeecg)
- Struts2 过滤 xss攻击 的一种解决方案
- XSS攻击处理
- XSS攻击的介绍及防御
- XSS 攻击的概念及防御
- XSS的定义及攻击汇总
- XSS攻击及防御
- XSS攻击及防御
- XSS攻击及防御
- XSS攻击及防御
- XSS攻击及防御
- XSS攻击及防御
- 如何理解HTTP协议的“无连接,无状态”特点
- HIbernate和Mybatis的区别和优劣势
- Angular核心服务$http
- Pixhawk之姿态解算篇(5)_ECF/EKF/GD介绍
- Shell学习笔记---循环
- struts2拦截器添加及xss攻击的处理
- 请假功能中计算有效工作日
- Android 基本动画详解
- File 重命名和删除功能
- 文章标题
- [附中OJ 1772] 0/1背包问题之2
- iOS之拷贝
- JFrame在桌面居中显示
- 搭建 maven 分布式开发项目的步骤