首页 > 其他分享 >过滤器_有效数据过滤

过滤器_有效数据过滤

时间:2022-12-28 14:01:52浏览次数:40  
标签:HttpServletRequest java request 有效 过滤 过滤器 import servlet javax


需求:


模拟:论坛过滤敏感词汇!



实现思路:


1.Dis.jsp    讨论区页面


2.DisServlet.java    处理提交


       ---》 获取请求参数


       ---》 保存到request域


       ---》 跳转dis.jsp  【从request取数据显示(处理后)】


3.EncodingFilter.java   过滤器


         ---》 编码过滤


4.DataFilter.java   过滤器


      ---》无效数据处理过滤



注意事项:


当有多个过滤器时,访问过滤器的顺序是按web.xml中的排放顺序执行,先写的先执行。



代码实现:

评论页面remark.jsp


JSP引入ckeditor组件:客户端组件,便于用户输入内容!

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'remark.jsp' starting page</title>

<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
<!-- 引入ckeditor组件(给用户输入提供方便) -->
<script src="${pageContext.request.contextPath }/ckeditor/ckeditor.js"></script>
<link rel="stylesheet" href="${pageContext.request.contextPath }/ckeditor/samples/sample.css">
</head>

<body>
${requestScope. remarkContent}
<form action="${pageContext.request.contextPath }/RemarkServlet" method="get">
<textarea class="ckeditor" name="remarkContent"></textarea>
<br/>
<input type="submit" value="评论"/>
</form>
</body>
</html>


EncodingFilter.java   编码过滤器

package com.cn.filter;
import java.io.IOException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 编码处理过滤器
* @author liuzhiyong
*
*/
public class EncodingFilter implements Filter{

/**
* 过滤器业务处理方法:处理公用的业务逻辑操作
*/
@Override
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {

//转型
final HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse)res;
/**
* 1.处理公用的逻辑业务
*/
//设置post方式提交的请求的编码
request.setCharacterEncoding("utf-8");//只对POST提交有效
//设置页面打开时的编码格式,设置响应体的编码格式
response.setContentType("text/html;charset=utf-8");

/**
* 出现get中文乱码,是因为在request.getParameter("参数名")方法内部没有进行提交方式判断并处理
*
* 解决:对指定接口的某一个方法进行功能扩展,可以使用代理:
* 对request对象(目标对象),创建代理对象
*/
HttpServletRequest requestProxy =(HttpServletRequest)Proxy.newProxyInstance(
request.getClass().getClassLoader(),// 定义代理对象类的类加载器。负责加载类的对象
new Class[]{HttpServletRequest.class}, //代理类要实现的接口列表
new InvocationHandler(){ 当调用目标对象对象方法的时候, 自动触发事务处理器
@Override
public Object invoke(Object proxy, Method method, Object[] args)//这里的args是调用方法传入的参数
throws Throwable {
//定义方法返回值
Object returnValue = null;

//当前执行方法的方法名
String methodName = method.getName();
//判断:对getParameter方法进行GET方式提交中文处理
if("getParameter".equals(methodName)){

//获取请求数据的值
String parameterValue = request.getParameter(args[0].toString());//调用目标对象的方法

//获取提交请求的提交方式
String submitMethod = request.getMethod();

//判断,如果是GET提交,需要对数据进行处理(POST提交已经处理过了)
if("GET".equals(submitMethod)){//注意在Servlet中这里是大写的GET
if(parameterValue!=null && !"".equals(parameterValue.trim())){
//处理GET方式提交的中文
parameterValue = new String(parameterValue.getBytes("ISO-8859-1"), "UTF-8");
}
}
return parameterValue;//返回getParameter方法的返回值
}else{
returnValue = method.invoke(request, args);//调用目标对象request的其它方法
return returnValue;//返回返回值
}
}
});


//2.放行(进入下一个过滤器或者进入Servlet)
chain.doFilter(requestProxy, response);//传入request代理对象requestProxy
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub

}

@Override
public void destroy() {
// TODO Auto-generated method stub

}
}


DataFilter.java   无效数据处理过滤器

package com.cn.filter;
import java.io.IOException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 无效数据过滤器
* @author liuzhiyong
*
*/
public class DataFilter implements Filter{

/**
* 初始化要过滤的无效数据
*/
private List<String> dirtyData;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//模拟数据库中的数据
dirtyData = new ArrayList<String>();
dirtyData.add("NND");
dirtyData.add("吃屎");
dirtyData.add("你大爷");
}

/**
* 过滤器业务处理方法:处理公用的业务逻辑操作
*/
@Override
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {

//转型
final HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse)res;
/**
* 1.处理公用的逻辑业务
*/
HttpServletRequest requestProxy =(HttpServletRequest)Proxy.newProxyInstance(
request.getClass().getClassLoader(),// 定义代理对象类的类加载器。负责加载类的对象
new Class[]{HttpServletRequest.class}, //代理类要实现的接口列表
new InvocationHandler(){ 当调用目标对象对象方法的时候, 自动触发事务处理器
@Override
public Object invoke(Object proxy, Method method, Object[] args)//这里的args是调用方法传入的参数
throws Throwable {
//定义方法返回值
Object returnValue = null;

//当前执行方法的方法名
String methodName = method.getName();
//判断:对getParameter方法进行处理
if("getParameter".equals(methodName)){

//获取请求数据的值
String parameterValue = request.getParameter(args[0].toString());//调用目标对象的方法

//如果parameterValue中出现dirtyData中的数据,用**替换
for(String data : dirtyData){
//判断当前输入数据中是否包含无效数据
if(parameterValue.contains(data)){
parameterValue = parameterValue.replace(data, "**");
}
}
//返回处理完无效数据后的正确数据
return parameterValue;//返回getParameter方法的返回值
}else{
returnValue = method.invoke(request, args);//调用目标对象request的其它方法
return returnValue;//返回返回值
}
}
});


//2.放行(进入下一个过滤器或者进入Servlet)
chain.doFilter(requestProxy, response);//传入request代理对象requestProxy
}

@Override
public void destroy() {
// TODO Auto-generated method stub

}
}


逻辑业务RemarkServlet

package com.cn.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class RemarkServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取参数
String remarkContent = request.getParameter("remarkContent");
//保存到request域对象中
request.setAttribute("remarkContent", "您发表的评论:"+remarkContent);
//转发
request.getRequestDispatcher("/remark.jsp").forward(request, response);
}
}


web.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

<!-- 编码处理过滤器配置 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>com.cn.filter.EncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<!-- 无效数据过滤器配置 -->
<filter>
<filter-name>dataFilter</filter-name>
<filter-class>com.cn.filter.DataFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>dataFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.cn.servlet.LoginServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>RemarkServlet</servlet-name>
<servlet-class>com.cn.servlet.RemarkServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>RemarkServlet</servlet-name>
<url-pattern>/RemarkServlet</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>


效果:



输入“ 你NND,我气死了,你大爷的,吃屎吧你!”,过滤效果如下:




过滤器_有效数据过滤_xml


标签:HttpServletRequest,java,request,有效,过滤,过滤器,import,servlet,javax
From: https://blog.51cto.com/u_15769923/5974393

相关文章

  • 过滤器_编码统一处理
    问题:处理请求数据中文问题!   【GET/POST】    每个servlet都要做这些操作,把公用的代码抽取-过滤器实现!问题原因:  出现get中文乱码,是......
  • 布隆过滤器详解
    (1)https://blog.csdn.net/tongkongyu/article/details/124842847 (2)https://blog.csdn.net/qq_38571892/article/details/123503418......
  • Json过滤
    varsettings=newJsonSerializerSettings{NullValueHandling=NullValueHandling.Ignore,ContractResolver=ShouldSe......
  • 使用awk过滤出来eth0的IP
    原始输出[root]#ifconfigeth0Linkencap:EthernetHWaddr6C:92:BF:2B:DC:2Finetaddr:100.8.73.88Bcast:100.8.73.255Mask:255.255.255.0......
  • 列表搜索(过滤)
    在有些项目中,一些没分页的搜索功能需要做,搜索一般分为精确搜索和模糊搜索。搜索也要叫过滤,一般用filter来实现。consta=[1,2,3,4,5,7,23,12]constresult=a.filter(i......
  • MapReduce实战之过滤日志及自定义日志输出路径案例(自定义OutputFormat)
    1)需求      过滤输入的log日志中是否包含atguigu      (1)包含atguigu的网站输出到e:/atguigu.log      (2)不包含atguigu的网站输出到e:/other.log2)输入......
  • 如何快速有效的定位应用抖动问题?| 龙蜥技术
    编者按:在服务器系统运行中,常见的问题包括服务器宕机、系统夯机、应用运行错误、性能抖动等,其中抖动问题是非常典型的容易出现且很难分析解决的问题。本文通过深入理解Linu......
  • 【推荐系统算法实战】协同过滤 CF 算法(Collaborative Filtering)
    什么是协同过滤算法?协同过滤推荐(CollaborativeFilteringRecommendation)。仅仅基于用户行为数据设计的推荐算法一般称为协同过滤算法。学术界对协同过滤算法进行了深......
  • Wireshark的使用(抓包、过滤器)
    1Wireshark是世界上最流行的网络分析工具。这个强大的工具可以捕捉网络中的数据,并为用户提供关于网络和上层协议的各种信息。与很多其他网络工具一样,Wireshark也使用pcapn......
  • IntelliJ IDEA 2021.3.2最新激活教程(可激活至2099年,亲测有效)
    欢迎关注博主公众号「季沐测试笔记」,专注于分享Java领域干货文章分享一下IntelliJIDEA2021.3.2的激活破解教程,永久激活,亲测有效,下面是详细文档哦~通过补丁可以......