登录验证
>>> 思路:
>>> 先假设拦截所有资源(Servlet, jsp...均不让访问),判断资源是否与登录有关:
>>> 1.与登录相关 ---- 直接放行
>>> 2.与登录无关 ---- 判断是否已经登录(已登录--放行; 未登录--跳转到登录界面)
@WebFilter("/*")
public class LoginFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
// 强转(为了使用getRequestURI()方法)
HttpServletRequest request = (HttpServletRequest)req;
// 获取资源请求路径
String URI = request.getRequestURI();
// 判断是否包含登录相关路径
if(URI.contains("/login.jsp") || URI.contains("/LoginServlet") || URI.contains("/css/") || URI.contains("/js/") || URI.contains("/fonts/") || URI.contains("/CheckServlet")){
// 是登录相关路径,直接放行
chain.doFilter(req, resp);
}else{
// 不是登录相关路径,根据是否登录决定是否放行 (登录:放行; 未登录,转发到登录界面)
Object adminUser = request.getSession().getAttribute("adminUser");
if(adminUser != null){
chain.doFilter(req, resp);
}else{
request.setAttribute("login_msg", "您尚未登录,请登录");
request.getRequestDispatcher("/login.jsp").forward(req, resp);
}
}
}
public void init(FilterConfig config) throws ServletException {
}
}
敏感词过滤
补充知识:设计模式之代理模式
为什么要引入代理模式?
实现敏感词过滤的基本思路:拦截获取request,将request对象中的一些属性进行敏感词处理(“baka"替换成”**"),放行处理后的request
然而,request有getParameter()方法,却没有setParameter()方法!! 因此,需要对request对象进行增强。
代理模式相关概念:
- 真实对象
- 代理对象
- 代理模式即:代理对象取代真实对象,达到增强真实对象功能的目的
实现步骤:
- 代理对象和真实对象相同的接口
- 代理对象 = Proxy.newProxyInstance()
- 重写处理器
- 增强方法
增强方式:
- 增强参数列表
- 增强返回值
- 增强方法体
/**
* 敏感词过滤器
*/
@WebFilter("/*")
public class SensitiveWordsFilter implements Filter {
private List<String> list = new ArrayList<>();
public void init(FilterConfig config) throws ServletException {
// 初始化时,加载文件中的敏感词到list中
try{
ServletContext servletContext = config.getServletContext();
String realPath = servletContext.getRealPath("/WEB-INF/classes/sensitive.txt");
BufferedReader br = new BufferedReader(new FileReader(realPath));
String line = null;
while((line = br.readLine()) != null){
list.add(line);
}
System.out.println(list);
br.close();
} catch (Exception e){
e.printStackTrace();
}
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
// 三个固定写法的参数: 类加载器,接口数组,处理器
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 {
if(method.getName().equals("getParameter")){
// 增强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; // 增强后的返回值
}else{
// 如果不是getParameter方法,正常执行
return method.invoke(req, args);
}
// 增强getParameterMap (略)
// 增强getParameterValue (略)
}
});
chain.doFilter(proxy_req, resp); // 放行的是增强后的request对象
}
public void destroy() {
}
}
End ♬
by a Lolicon ✪