大家好,又见面了,我是你们的朋友全栈君。
struts2拦截器添加及xss攻击的处理
先在struts2.xml中添加拦截路径。
代码语言:javascript复制<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中添加注解:
代码语言:javascript复制@ParentPackage(value="base")
如果action中都有继续统一的BaseAction则可以在BaseAction中写入此注解如:
代码语言:javascript复制@ParentPackage(value="base")
public class BaseAction extends WebApplicationObjectSupport implements Action {
在添加拦截器类及方法:
我做这拦截添加了防止页面中传入的xss攻击代码
2、拦截器要继承MethodFilterInterceptor类这样xml中的<param name=”excludeMethods”>login</param>不拦截的方法才能生效不然不生效别怪我哟。
代码语言:javascript复制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 字符(十六进制格式) 是: <
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')) { // <, <
sb.append('<');
return;
}
if (s.charAt(index 1) == '6' && s.charAt(index 2) == '0') { // < (0x3c=60)
sb.append('<');
return;
}
if (s.charAt(index 1) == '3' && (s.charAt(index 2) == 'e' || s.charAt(index 2) == 'E')) { // >, >
sb.append('>');
return;
}
if (s.charAt(index 1) == '6' && s.charAt(index 2) == '2') { // > (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页面。也可以根据自己的需要添加