filter过滤器,顾名思义,即在执行相关请求时,通过过滤器可以将请求拦截,并作出处理,再对请求放行,从而达到对请求拦截能力;比如,客户端提交数据时的敏感词过滤,编码的统一过滤,登录过滤等。
Filter创建与使用
- 创建类实现Filter接口
- 实现doFilter方法
- 配置Filter
- 基于注解配置
- 通过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(">", ">")
// .replaceAll("<", "<");
//通过工具类对字符串不解析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);
}
本文介绍了Java中的Filter过滤器如何使用,包括创建Filter、通过注解和web.xml配置,以及在实际应用中如何进行非法访问和XSS攻击的过滤,以增强系统的安全性。
的使用&spm=1001.2101.3001.5002&articleId=108305027&d=1&t=3&u=1d5afd0c9e994a83af6964978d6461db)
1156

被折叠的 条评论
为什么被折叠?



