Filter(过滤器)的使用

本文介绍了Java中的Filter过滤器如何使用,包括创建Filter、通过注解和web.xml配置,以及在实际应用中如何进行非法访问和XSS攻击的过滤,以增强系统的安全性。

filter过滤器,顾名思义,即在执行相关请求时,通过过滤器可以将请求拦截,并作出处理,再对请求放行,从而达到对请求拦截能力;比如,客户端提交数据时的敏感词过滤,编码的统一过滤,登录过滤等。

Filter创建与使用

  1. 创建类实现Filter接口
  2. 实现doFilter方法
  3. 配置Filter
    1. 基于注解配置
    2. 通过web.xml配置

编码过滤

public class EncodingFilter implements Filter {
    String encoding;
    @Override
    public void init(FilterConfig config) throws ServletException {
       //获取请求参数的编码
        encoding = config.getInitParameter("encoding");
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        //如果请求参数未传递编码则默认使用ut-8
        encoding = encoding == null ? "utf-8" : encoding;
        //设置请求响应编码
        req.setCharacterEncoding(encoding);
        resp.setCharacterEncoding(encoding);
        chain.doFilter(req,resp);
    }

}

配置web.xml

<filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>com.softeem.filter.EncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>utf-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

非法访问过滤

/**
* 拦截所有对/amdin/*下的资源
*/
@WebFilter("/admin/*")
public class LoginFilter implements Filter {
    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        //将ServletRequest转换为HttpServletRequest
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;
        //从session中获取用户信息
        Object obj = request.getSession().getAttribute("user");
        if(obj != null){
            //说明用户已登录,放行
            chain.doFilter(request,response);
        }else{
            //强行跳转到登录页面
            //            response.sendRedirect("/login.jsp");
            request.setAttribute("msg","亲,登录后再试!");
            request.getRequestDispatcher("/login.jsp").forward(request,response);
        }
    }
}

XSS过滤
XSS(Cross Site Scripting),跨站脚本攻击,是一种常见的网络攻击方式,通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法(比如表单提交时输入脚本代码或者网页代码)注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java、 VBScript、ActiveX、 Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。
​为防止以上攻击方式的发生,通常可以通过过滤器对请求内容进行过滤并处理,具体操作如下:
编写request包装器(XssRequest.java)

/**
 * 请求包装器
 * @author mrchai
 */
public class XssRequest extends HttpServletRequestWrapper{

	public XssRequest(HttpServletRequest request) {
		super(request);
	}

	@Override
	public String getParameter(String name) {
		String value = super.getParameter(name);
		return handler(value);
	}

	@Override
	public String[] getParameterValues(String name) {
		//根据指定name属性获取所有的value值集合(未经处理的数据)
		String[] values = super.getParameterValues(name);
		if(Objects.isNull(values)){
			return null;
		}
		//创建新数组存储处理过之后的数据
		String[] newValues = new String[values.length];
		//循环遍历未经处理的数据并进行处理后存入新数组中
		for (int i = 0; i < values.length; i++) {
			newValues[i] = handler(values[i]);
		}
		return newValues;
	}
	
	/**核心转换方法,实现将特殊字符替换为安全的文本*/
	public String handler(String value){
		if(Objects.isNull(value)){
			return null;
		}
//		原理为替换原本请求内容中的特殊字符		
//		value = value.replaceAll(">", "&gt;")
//				.replaceAll("<", "&lt;");
		
		//通过工具类对字符串不解析html代码(需导入commons-lang和commons-text包)
		value = StringEscapeUtils.escapeHtml4(value);
		return value;
	}
}

编写过滤器类(XssFilter.java)

@WebFilter("/*")
public class XssFilter implements Filter{

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
        throws IOException, ServletException {
        System.out.println("xss过滤");
        //将ServletRequest强制转换为HttpServletRequest
        HttpServletRequest request = (HttpServletRequest)req;
        //执行过滤器链(放行请求到下一个过滤器)
        chain.doFilter(new XssRequest(request), resp); 
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值