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攻击将处理后的参数重新setaction值中            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页面。也可以根据自己的需要添加








原创粉丝点击