在springboot 中,主要是靠FilterRegistrationBean 这个类来提供这样的功能。具体而言:
自定义Filter需要两个步骤:
1.实现Filter【javax.servlet.Filter】接口,实现Filter方法
2.添加 @Configuration 注解,将自定义Filter加入过
SSM过滤器版本在这里,当然这个你也可以修改为SSM的。
点击进入
在springboot 中,主要是靠FilterRegistrationBean 这个类来提供filter的功能。
自定义Filter需要一下几个步骤:
1.实现Filter【javax.servlet.Filter】接口,实现Filter方法,在doFilter中实现自己的代码
2.创建Filter配置类,添加 @Configuration 注解,将自定义Filter加入过滤器链
以下使用预防Xss攻击作为例子。大致的原理都是一样的。
现在开始代码:
第一步,定义过滤器XssFilter.java
import org.apache.commons.lang3.StringUtils;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 防止XSS攻击的过滤器
*
* @author haohaowang,top
*/
public class XssFilter implements Filter
{
/**
* 排除链接(在配置文件中可以自定义,这样可以解耦)
*/
public List excludes = new ArrayList<>();
/**
* xss过滤开关,在配置文件中定义,默认为false
*/
public boolean enabled = false;
@Override
public void init(FilterConfig filterConfig) throws ServletException
{
//在配置过滤器的时候放入参数,在这里可以拿到
String tempExcludes = filterConfig.getInitParameter("excludes");
String tempEnabled = filterConfig.getInitParameter("enabled");
if (StringUtils.isNotEmpty(tempExcludes))
{
String[] url = tempExcludes.split(",");
for (int i = 0; url != null && i initParameters = Maps.newHashMap();
initParameters.put("excludes", excludes);
initParameters.put("enabled", enabled);
/**
* Set init-parameters for this registration. Calling this method will replace any
* existing init-parameters. 设置此注册的init参数。调用此方法将替换一些默认参数。
* @param initParameters the init parameters
* @see #getInitParameters
* @see #addInitParameter
*/
//这里传递参数到init方法,在上面的代码中可以拿到,我们使用这些参数进行初始化过滤器
registration.setInitParameters(initParameters);
return registration;
}
}
Xss攻击的处理类XssHttpServletRequestWrapper.java
import org.jsoup.Jsoup;
import org.jsoup.safety.Whitelist;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
/**
* XSS过滤处理
*
*/
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper
{
/**
* @param request
*/
public XssHttpServletRequestWrapper(HttpServletRequest request)
{
super(request);
}
@Override
public String[] getParameterValues(String name)
{
String[] values = super.getParameterValues(name);
if (values != null)
{
int length = values.length;
String[] escapseValues = new String[length];
for (int i = 0; i alert("欢迎来到浩")
点击保存
然后就弹出了,这是我们不想要的效果。
我们打开Xss过滤
点击保存后代码变成这样
浏览器就不会执行这样的代码。
评论 (0)