JavaWeb 快速入门 --Filter&Listener,java 百度网盘课程
案例:字符编码转换
@WebFilter("/*")
public class CharchaterFilter implements Filter {
protected String encoding;
public void destroy() {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
//将父接口转换为子接口
HttpServletRequest request=(HttpServletRequest)req;
HttpServletResponse response=(HttpServletResponse)res;
//获取请求方法
String method=request.getMethod();
//解决 post 请求中文数据乱码问题
if(method.equalsIgnoreCase("post")) {
request.setCharacterEncoding("utf-8");
}
//处理响应乱码
response.setContentType("text/html;charset=utf-8");
chain.doFilter(request,response);
}
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
}
}
案例:敏感词过滤
/**
敏感词汇过滤器
*/
@WebFilter("/*")
public class SensitiveWordsFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//1.创建代理对象,增强 getParameter 方法
ServletRequest proxy_req = (ServletRequest) Proxy.newProxyInstance(req.getClass().getClassLoader(), req.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//增强 getParameter 方法
//判断是否是 getParameter 方法
if(method.getName().equals("getParameter")){
//增强返回值
//获取返回值
String value = (String) method.invoke(req,args);
if(value != null){
for (String str : list) {
if(value.contains(str)){
value = value.replaceAll(str,"***");
}
}
}
return value;
}
//判断方法是否是: getParameterMap
//判断方法是否是: getParameterValue
return method.invoke(req,args);
}
});
//2.放行
chain.doFilter(proxy_req, resp);
}
private List<String> list = new ArrayList<String>();//敏感词汇集合
public void init(FilterConfig config) throws ServletException {
try{
//1.获取文件真实路径
ServletContext servletContext = config.getServletContext();
String realPath = servletContext.getRealPath("/WEB-INF/classes/敏感词汇.txt");
//2.读取文件
BufferedReader br = new BufferedReader(new FileReader(realPath));
//3.将文件的每一行
String line = null;
while((line = br.readLine())!=null){
list.add(line);
}
br.close();
System.out.println(list);
}catch (Exception e){
e.printStackTrace();
}
}
public void destroy() {
}
}
/**
验证方法
*/
@WebServlet("/testServlet")
public class TestServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
String name = request.getParameter("name");
String msg = request.getParameter("msg");
System.out.println(name+":"+msg);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
过滤器 JavaWeb 三大组件之一,当我们请求服务器的资源时,过滤器会在这组资源之前执行,它可以将我们的请求拦截下来,判断是否让我们访问这个资源,并完成一些特殊的功能。过滤器一般用于完成通用的操作。如:登录验证、统一编码处理、敏感字符过滤…
[](
)Listener:监听器
监听器 JavaWeb 的三大组件之一,在我们执行请求之前执行,主要用于监听 Web 服务器中的某一个执行动作,并根据其要求做出响应的响应。
目前 Servlet 中包含 8 个 Listener 接口,可以将其归纳为 3 类:
ServletContextListener:监听 ServletContext 对象的创建和销毁
方法:
void contextDestroyed(ServletContextEvent sce) :ServletContext 对象被销毁之前会调用该方法
void contextInitialized(ServletContextEvent sce) :ServletContext 对象创建后会调用该方法
步骤:
定义一个类,实现 ServletContextListener 接口
复写方法
配置
web.xml
<listener>
<listener-class>cn.itcast.web.listener.ContextLoaderListener</listener-class>
</listener>
指定初始化参数<context-param>
注解:
@WebListener
代码实现
@WebListener
public class ContextLoaderListener implements ServletContextListener {
/**
监听 ServletContext 对象创建的。ServletContext 对象服务器启动后自动创建
在服务器启动后自动调用
@param servletContextEvent
*/
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
//加载资源文件
//1.获取 ServletContext 对象
ServletContext servletContext = servletContextEvent.getServletContext();
//2.加载资源文件
String contextConfigLocation = servletContext.getInitParameter("contextConfigLocation");
评论