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页面。也可以根据自己的需要添加


struts2拦截器添加及xss攻击的处理相关推荐

  1. Struts2拦截器的使用

    如何使用struts2拦截器,或者自定义拦截器.特别注意,在使用拦截器的时候,在Action里面必须最后一定要引用struts2自带的拦截器缺省堆栈defaultStack,如下(这里我是引用了str ...

  2. Struts2拦截器实现异常处理机制

    http://bbs.itcast.cn/thread-10364-1-1.html Struts2拦截器实现异常处理机制   在j2ee项目中,系统内部难免会出现一些异常,如果把异常放任不管直接打印 ...

  3. Struts2拦截器的使用 (详解)

    Struts2拦截器的使用 (详解) 如何使用struts2拦截器,或者自定义拦截器.特别注意,在使用拦截器的时候,在Action里面必须最后一定要引用struts2自带的拦截器缺省堆栈default ...

  4. struts2 拦截器_Struts2令牌拦截器示例

    struts2 拦截器 Struts 2 token interceptor can be used to handle multiple form submission problem. While ...

  5. struts2 拦截器_Struts2 execAndWait拦截器示例,用于长时间运行的动作

    struts2 拦截器 Sometimes we have long running actions where user will have to wait for final result. In ...

  6. struts2拦截器理论知识

    软件设计中DRY规则,即不要写重复的代码,这样可以大大减轻后期维护的工作量!但是问题来了,重复的代码是不可避免的,比如在用户发送请求之前先判断用户是否登录,怎么办呢?于是就把这些重复代码提取出来,封装 ...

  7. Struts2 拦截器(Interceptor )原理和配置

    Struts2 拦截器 拦截器在概念上与servlet过滤器或JDK代理类相同.拦截器允许横切功能,把action以及框架分开实现.你可以使用拦截器实现以下操作: 在调用action之前提供预处理逻辑 ...

  8. 基于SSH2框架Struts2拦截器的登录验证实现 来自菠萝大象

    本文为菠萝大象原创,如要转载请注明出处. 通过之前的 Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解系列文章,我们已经成功将这三种框架整合到了一起, 这次大 ...

  9. Struts2 拦截器的配置:

    Struts2 拦截器的配置: 第一步:在struts.xml文件中加入拦截器配置: 我们可以在配置拦截器的时候,自己定义一个拦截器栈来包含我们自己定义的拦截器(注意:一定要将 defaultStac ...

  10. Struts2拦截器和标签

    一.struts2拦截器 1.struts2是框架,封装了很多的功能,struts2里面封装的功能都是在拦截器里面. 2 struts2里面封装了很多的功能,有很多拦截器,不是每次这些拦截器都执行,每 ...

最新文章

  1. 一、面试题(持续跟新)
  2. 荣耀30s鸿蒙5g,荣耀赵明:荣耀30S将掀起5G手机购买狂潮
  3. python文件存储过程_python调用MySql存储过程
  4. maya python 弹出窗口_maya python打印状态复选框?
  5. 编写一个函数,计算下式当n=10和n=100的值。
  6. mysql典型安装和自定义_Mysql8.0.19下载安装—windows版本自定义安装
  7. [七]JavaIO之 PipedInputStream 和 PipedInputStream
  8. 服务器放在机柜_服务器网络机柜的保养维护
  9. DirectX12_基础知识
  10. 计算机网络中处理通信控制功能的是,在计算机网络中处理通信控制功能的计算机是()。A.通信线路B.终端C.主计算机D.通信控制处理机...
  11. 数据库实现一个轻量的背单词APP
  12. Redis(三) Redis的持久化 RDB与AOF
  13. win10文件夹加密_专业的文件隐藏软件——文件夹隐藏精灵PC软件
  14. you-get的一点修改
  15. Yii2-Admin-Theme 基于layui的通用后台模板
  16. 【论文笔记】Pre-train, Prompt, and Predict: A Systematic Survey of Prompting Methods in NLP
  17. 美团笔试题_20220409
  18. MySQL8高级_读写分离和分库分表
  19. 共享单车登录显示服务器未响应,ofo共享单车出故障了吗?ofo共享单车无法登陆、连接不上、无法结算怎么回事?[图]...
  20. t420i升级固态硬盘提升_给自己的办公设备大升级:购入雷克沙固态移动硬盘,享受高速...

热门文章

  1. Windows扫雷游戏python
  2. 作为前端程序员:你必须知道的常用英语词汇!!全是干货!!!
  3. 前端英文和数字不换行怎么解决
  4. iPhone卡三格信号网络不通无服务
  5. 小程序 Vant Weapp 使用插槽自定义 Cell 的左侧图标
  6. 开放世界游戏中的大地图的实现——程序技术篇
  7. [转载]Matlab定积分近似计算
  8. 计算机在高分子材料与工程中的应用,计算机技术在高分子材料工程中的应用.doc...
  9. 使用DAEMON Tools Ultra制作Ubuntu启动U盘全过程(含图文)
  10. 如何搭建威纶通触摸屏与S7-200smart之间无线PPI通信?