过滤器案例-----自动登录、登录验证、过滤敏感词汇

一、自动登录案例

index.jsp:
  <body>
    <c:if test="${empty user }">
    	<h1><a href="login.jsp">去登录</a></h1>
    </c:if>
    <c:if test="${not empty user }">
    	<h1>欢迎你,${user }!</h1>
    </c:if>
  </body>
login.jsp:
 
<body>
    <form action="login" method="post">
    	用户名:<input type="text" name="username"><br>
    	密码:<input type="password" name="password"><br>
    	<input type="radio" name="autologin" value="on">自动登录<br>
    	<input type="submit" value="提交">
    </form>
    <span style="color:red;">${error_msg }</span>
  </body>
LoginServlet:
 
package hcx.java.filter.demo2;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 当前Servlet用于处理用户登录逻辑.
 * @author HCX
 *
 */
public class LoginServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		doPost(request, response);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		
		if(username==null||password==null||"".equals(username)||"".equals(password)){
			// 说明用户没有输入用户名和密码
			request.setAttribute("error_msg", "请输入你的用户名和密码!");
			request.getRequestDispatcher("/login.jsp").forward(request, response);
		}else if(username.equals("admin")&&password.equals("admin")){
			// 获取自动登陆的值,进行判断
			String autologin = request.getParameter("autologin");
			if("on".equals(autologin)){
				Cookie cookie = new Cookie("user",username+"#"+password);
				cookie.setMaxAge(60*60*24*7);
				cookie.setPath("/");
				response.addCookie(cookie);
			}
			
			request.getSession().setAttribute("user", username);
			response.sendRedirect("/day0106/index.jsp");
		}
	}

}
AutoLoginFilter:
package hcx.java.filter.demo2;

import java.io.IOException;

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.Cookie;
import javax.servlet.http.HttpServletRequest;

/**
 * 当前Filter用于完成用户自动登录功能.
 * @author HCX
 */
public class AutoLoginFilter implements Filter {

	public void destroy() {
	}

	public void doFilter(ServletRequest req, ServletResponse resp,
			FilterChain chain) throws IOException, ServletException {
		HttpServletRequest request = (HttpServletRequest)req;
		Cookie[] cookies = request.getCookies();
		if(cookies != null){
			for (Cookie cookie : cookies) {
				if(cookie != null){
					String name = cookie.getName();
					if("user".equals(name)){
						// 曾经登录过
						String value = cookie.getValue();
						
						String username = value.split("#")[0];
						String password = value.split("#")[1];
						
						request.getSession().setAttribute("user", username);
						chain.doFilter(request, resp);
					}else{
						// 没有登陆过
						chain.doFilter(request, resp);
					}
				}
			}
		}else{
			// 没有登陆过
			chain.doFilter(request, resp);
		}
	}

	public void init(FilterConfig arg0) throws ServletException {
	}

}
xml:
<filter>
  	<filter-name>AutoLoginFilter</filter-name>
  	<filter-class>app.java.filter.demo2.AutoLoginFilter</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>AutoLoginFilter</filter-name>
  	<url-pattern>/index.jsp</url-pattern>
  </filter-mapping>

二、登录验证

package com.hcx.servlet.web.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

/**
 * Created by hongcaixia on 2017/1/22.
 */
@WebFilter("/*")
public class LoginFilter implements Filter {

    public void init(FilterConfig config) throws ServletException {

    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {

        HttpServletRequest request = (HttpServletRequest)req;
        String uri = request.getRequestURI();
        if(uri.contains("/login")){
            chain.doFilter(req, resp);
        }else{
            Object user = request.getSession().getAttribute("user");
            if(user!=null){
                chain.doFilter(req,resp);
            }else{
                //没有登录
                request.setAttribute("login_msg","您尚未登录,请登录");
                request.getRequestDispatcher("/login.jsp").forward(req,resp);
            }
        }
    }

    public void destroy() {

    }
    
}

 

三、过滤敏感词汇

package com.hcx.servlet.web.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.nio.Buffer;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by hongcaixia on 2017/1/22.
 */
@WebFilter("/sensitiveWordsFilter")
public class SensitiveWordsFilter implements Filter {

    private List<String> list = new ArrayList<String>();

    public void init(FilterConfig config) throws ServletException {
        //加载敏感词汇的文件
        ServletContext servletContext = config.getServletContext();
        String realPath = servletContext.getRealPath("/WEB-INF/classes/敏感词汇.txt");

        try {
            BufferedReader bufferedReader = new BufferedReader(new FileReader(realPath));

            String line = null;
            if((line = bufferedReader.readLine())!=null){
                list.add(line);
            }
            bufferedReader.close();
        } catch (Exception e) {
            e.printStackTrace();
        }


    }

    public void doFilter(final ServletRequest req, final ServletResponse resp, FilterChain chain) throws ServletException, IOException {

        ServletRequest proxyRequest = (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")){
                    String value = (String) method.invoke(req, args);
                    if(value!=null){
                        for(String str : list){
                            value = value.replaceAll(str,"***");
                        }
                    }
                    return value;
                }
                return method.invoke(req,args);
            }
        });

        chain.doFilter(proxyRequest, resp);
    }

    public void destroy() {
    }


}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值