黑马程序员
Filter–案例1–登陆验证–分析
Filter–案例1–登陆验证–代码实现
- 准备工作
package cn.itcast.web.servlet;
import cn.itcast.web.domain.User;
import org.apache.commons.beanutils.BeanUtils;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
if (request.getParameter("username") == null || request.getParameter("password") == null) {
request.setAttribute("msg", "请将信息填写完整");
request.getRequestDispatcher("/login.jsp").forward(request, response);
return;
}
Map<String, String[]> parameterMap = request.getParameterMap();
User user = new User();
try {
BeanUtils.populate(user, parameterMap);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
request.getSession().setAttribute("user",user);
response.sendRedirect(request.getContextPath()+"/index.jsp");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
package cn.itcast.web.filter;
import com.sun.deploy.net.HttpRequest;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
@WebFilter(value = "/*",dispatcherTypes = DispatcherType.REQUEST)
public class LoginFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) req;
String requestURI = request.getRequestURI();
if (requestURI.contains("/login.jsp") || requestURI.contains("/LoginServlet")) {
request.setAttribute("msg","");
chain.doFilter(request,resp);
} else {
if (request.getSession().getAttribute("user") != null) {
chain.doFilter(request, resp);
}else {
request.setAttribute("msg","请先登陆");
request.getRequestDispatcher("/login.jsp").forward(request,resp);
}
}
}
public void init(FilterConfig config) throws ServletException {
}
}
Filter–案例–过滤敏感词汇–分析
Filter–案例–过滤敏感词汇–基本实现步骤
动态代理–增强方法
package cn.itcast.web.proxy;
public interface SaleComputer {
public String sale(double money);
public void show();
}
package cn.itcast.web.proxy;
public class Lenovo implements SaleComputer {
@Override
public String sale(double money) {
return "花了"+money+"买了一台电脑";
}
@Override
public void show(){
System.out.println("展示电脑。。。");
}
}
package cn.itcast.web.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyTest {
public static void main(String[] args) {
Lenovo lenovo = new Lenovo();
SaleComputer o = (SaleComputer) Proxy.newProxyInstance(lenovo.getClass().getClassLoader(), lenovo.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("代理方法"+method.getName()+"被执行");
//System.out.println(method.getName() + "-->参数" + args[0]);
if (method.getName().equals("sale")) {
double money = (double) args[0];
Object invoke = method.invoke(lenovo, money);
return invoke+"送电脑包";
}else {
Object invoke = method.invoke(lenovo, args);
return invoke;
}
}
});
String sale = o.sale(8000d);
System.out.println(sale);
System.out.println("***********************");
o.show();
}
}
Filter–案例–过滤敏感词汇–实现
- 读取txt文件乱码:
BufferedReader read = new BufferedReader(new FileReader(new File(filename)));
- 解决办法:
InputStreamReader isr = new InputStreamReader(new FileInputStream(file), "UTF-8");
BufferedReader read = new BufferedReader(isr);
因为InputStreamReader
和BufferedReader
都继承自Reader
,而BufferedReader
的构造器又是Reader
.
package cn.itcast.web.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;
@WebFilter("/*")
public class SensitiveWordFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) Proxy.newProxyInstance(req.getClass().getClassLoader(), req.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (method.getName().equals("getParameter")) {
String invoke = (String) method.invoke(req, args);
if (invoke != null) {
for (String o : list) {
if (invoke.contains(o)) {
invoke = invoke.replaceAll(o, "**");
}
}
}
return invoke;
}
return method.invoke(req, args);
}
});
chain.doFilter(request, resp);
}
private List<String> list = new ArrayList<String>();
public void init(FilterConfig config) throws ServletException {
BufferedReader bufferedReader = null;
try {
String realPath = config.getServletContext().getRealPath("WEB-INF/classes/敏感词汇.txt");
//bufferedReader = new BufferedReader(new FileReader(realPath));//乱码
bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(realPath), "UTF-8"));
String str = "";
while ((str = bufferedReader.readLine()) != null) {
list.add(str);
System.out.println(str);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}