zoukankan      html  css  js  c++  java
  • Filter的应用

    Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是过滤字符编码、做一些业务逻辑判断等。其工作原理是,只要你在web.xml文件配置好要拦截的客户端请求,它都会帮你拦截到请求,此时你就可以对请求或响应(Request、Response)统一设置编码,简化操作;同时还可进行逻辑判断,如用户是否已经登陆、有没有权限访问该页面等等工作。它是随你的web应用启动而启动的,只初始化一次,以后就可以拦截相关请求,只有当你的web应用停止或重新部署的时候才销毁。

    一、Filter在页面编码的应用

    private FilterConfig filterConfig;
    private String defaultCharSet = "UTF-8";
    String charSet =null;
    public void doFilter(ServletRequest req, ServletResponse resp,
    FilterChain chain) throws IOException, ServletException {

    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) resp;

    charSet = filterConfig.getInitParameter("charSet");
    if(charSet == null){

    charSet = defaultCharSet;
    }

    //1.解决post提交 的乱码
    request.setCharacterEncoding(charSet);
    response.setCharacterEncoding(charSet);
    response.setContentType("text/html;charset="+charSet);


    chain.doFilter(new MyRequest(request), response);

    }

    class MyRequest extends HttpServletRequestWrapper{

    private HttpServletRequest request;

    public MyRequest(HttpServletRequest request) {
    super(request);
    this.request = request;
    }

    @Override
    public String getParameter(String name) {

    String value = this.request.getParameter(name);
    if(value==null){
    return null;
    }

    if(!this.request.getMethod().equalsIgnoreCase("get")){
    return value;
    }

    try {
    value = new String(value.getBytes("iso8859-1"),charSet);
    return value;
    } catch (UnsupportedEncodingException e) {
    throw new RuntimeException(e);
    }
    }

    }

    public void init(FilterConfig filterConfig) throws ServletException {

    this.filterConfig = filterConfig;
    }

    二、Filter在用户自动登录中的应用

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

    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) resp;

    //1.检查用户是否登陆
    User user = (User) request.getSession().getAttribute("user");
    if(user!=null){
    chain.doFilter(request, response);
    return;
    }

    //2.检查用户是否带自动登陆的cookie过来
    Cookie autoLoginCookie = null;
    Cookie cookies[] = request.getCookies();
    for(int i=0;cookies!=null&&i<cookies.length;i++){
    if(cookies[i].getName().equals("autoLogin")){
    autoLoginCookie = cookies[i];
    }
    }
    if(autoLoginCookie==null){
    chain.doFilter(request, response);
    return;
    }

    //3.用户带自动登陆cookie来了,但是cookie值不正常
    String value = autoLoginCookie.getValue();
    if(value.split("\:").length!=3){
    chain.doFilter(request, response);
    return;
    }

    //3.用户带自动登陆cookie来了,并且cookie正常,则程序帮用户完成自动登陆
    String username = value.split("\:")[0];
    long expiresTime = Long.parseLong(value.split("\:")[1]);
    String md5value = value.split("\:")[2];


    //4.判断cookie的有效期是否过期
    if(expiresTime>=System.currentTimeMillis()){
    chain.doFilter(request, response);
    return;
    }

    //5.得到服务器中相对应的MD5的值
    UserDao dao = new UserDao();
    user = dao.find(username);
    String password = user.getPassword();
    String server_md5value = md5(username + ":" + expiresTime + ":" + password);


    //6.md5值不相等
    if(!server_md5value.equals(md5value)){
    chain.doFilter(request, response);
    return;
    }

    request.getSession().setAttribute("user", user);
    chain.doFilter(request, response);

    }

    三、Filter控制浏览器缓存jscssjpg等文件中的应用

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

    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) resp;

    //1.得到请求的是什么资源 css js jpg
    String uri = request.getRequestURI();
    if(uri.endsWith(".css")){
    long expriesTime = Integer.parseInt(this.config.getInitParameter("css"))*1000;
    response.setDateHeader("expires", System.currentTimeMillis()+expriesTime);
    }else if(uri.endsWith(".js")){
    long expriesTime = Integer.parseInt(this.config.getInitParameter("js"))*1000;
    response.setDateHeader("expires", System.currentTimeMillis()+expriesTime);
    }else if(uri.endsWith(".jpg")){
    long expriesTime = Integer.parseInt(this.config.getInitParameter("jpg"))*1000;
    response.setDateHeader("expires", System.currentTimeMillis()+expriesTime);
    }
    chain.doFilter(request, response);
    }

    四、Filter压缩文件的应用

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

    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) resp;

    //getOuputStream MyServletOutputStream
    //getWriter MyWriter

    //创建response,捕获目标资源输出的数据
    MyResponse myresponse = new MyResponse(response);

    chain.doFilter(request, myresponse);

    //得到目标资源输出
    byte resouceData[] = myresponse.getBuffer();
    System.out.println("原始大小:" + resouceData.length);

    //压缩数据
    byte gzipData[] = gzip(resouceData);

    //输出压缩数据给浏览器
    response.setHeader("Content-Encoding", "gzip");
    response.setContentLength(gzipData.length);
    response.getOutputStream().write(gzipData); //utf-8

    }

    public byte[] gzip(byte src[]) throws IOException{
    ByteArrayOutputStream bout = new ByteArrayOutputStream();

    GZIPOutputStream gout = new GZIPOutputStream(bout);
    gout.write(src);
    gout.close();

    return bout.toByteArray();

    }

    class MyResponse extends HttpServletResponseWrapper{

    private HttpServletResponse response;

    private ByteArrayOutputStream bout = new ByteArrayOutputStream();

    private PrintWriter pw = null;

    public MyResponse(HttpServletResponse response) {
    super(response);
    this.response = response;
    }

    @Override
    public ServletOutputStream getOutputStream() throws IOException {
    return new MyServletOuputStream(bout);
    }

    @Override
    public PrintWriter getWriter() throws IOException {
    pw = new PrintWriter(new OutputStreamWriter(bout,this.response.getCharacterEncoding())); //printWriter.writer("中国");
    return pw;
    }

    public byte[] getBuffer(){
    if(pw!=null){
    pw.close();
    }
    return bout.toByteArray();
    }

    }







    class MyServletOuputStream extends ServletOutputStream{

    private ByteArrayOutputStream bout; //FileOuputStream
    public MyServletOuputStream(ByteArrayOutputStream bout){
    this.bout = bout;
    }
    @Override
    public void write(int b) throws IOException {
    bout.write(b);
    }

    }

    五、Filter过滤敏感词汇的应用

    private List<String> banWords = new ArrayList(); //保存用于匹配所有禁用词的正则表达式
    private List<String> auditWords = new ArrayList(); //审核词
    private List<String> replaceWords = new ArrayList(); //替换词

    public void init(FilterConfig filterConfig) throws ServletException {
    try{
    String path = WordsFilter.class.getClassLoader().getResource("cn/itcast/words").getPath();
    File filepath = new File(path);
    File files[] = filepath.listFiles();
    for(File f : files){
    if(!f.getName().endsWith(".txt")){
    continue;
    }
    BufferedReader br = new BufferedReader(new FileReader(f));
    String line = null;
    while((line=br.readLine())!=null){
    String values[] = line.trim().split("\|");
    if(values.length!=2){
    continue;
    }
    String word = values[0];
    String type = values[1];

    if(type.trim().equals("1")){
    banWords.add(word);
    }else if(type.trim().equals("2")){
    auditWords.add(word);
    }else if(type.trim().equals("3")){
    replaceWords.add(word);
    }
    }
    }

    System.out.println("haha");

    }catch (Exception e) {
    throw new RuntimeException(e);
    }

    }

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


    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) resp;

    //1.检查用户的请求数据中是否包含禁用词,包含禁用词则直接跳转到消息显示页面
    Enumeration e = request.getParameterNames();
    while(e.hasMoreElements()){
    String value = request.getParameter((String) e.nextElement()); //你生小孩子没屁眼
    if(value==null){
    continue;
    }
    for(String pattern : banWords){
    Pattern p = Pattern.compile(pattern); //得到一个代表pattern的正则表达式对象
    Matcher m = p.matcher(value); //得到与字符串相匹配的匹配器
    if(m.find()){
    request.setAttribute("message", "请文明用词!!!");
    request.getRequestDispatcher("/message.jsp").forward(request, response);
    return;
    }
    }
    }



    chain.doFilter(new MyRequest(request), response);
    }

    class MyRequest extends HttpServletRequestWrapper{
    private HttpServletRequest request;
    public MyRequest(HttpServletRequest request) {
    super(request);
    this.request = request;
    }
    @Override
    public String getParameter(String name) {
    String value = this.request.getParameter(name); //帮用户获取它所需的数据
    //对数据进行检查,如果发现包含审核或替词,则分别高亮、替换后再把数据返回给用户
    if(value==null){
    return null;
    }

    //检查是否包含审核词
    for(String pattern : auditWords){ //吃.{0,2}人
    Pattern p = Pattern.compile(pattern);
    Matcher m = p.matcher(value);
    while(m.find()){ //调用匹配器的方法检查value中是否包含审核数据
    String data = m.group(); //返回value中与正则表达式匹配的数据
    value = value.replaceAll(data, "<font color='red'>"+data+"</font>");
    }
    }


    //检查是否包含替换词
    for(String pattern : replaceWords){ //吃.{0,2}人
    Pattern p = Pattern.compile(pattern);
    Matcher m = p.matcher(value);
    while(m.find()){ //调用匹配器的方法检查value中是否包含审核数据
    String data = m.group(); //返回value中与正则表达式匹配的数据
    value = value.replaceAll(data, "*******");
    }
    }
    return value;
    }
    }

  • 相关阅读:
    php生成excel
    gearmand
    开启Nginx的目录文件列表功能
    zend框架学习
    引用方法形成树
    智能指针实现
    图文例解C++类的多重继承与虚拟继承
    CC++定位崩溃代码行的方法
    C++函数重定义、重载、重写
    勤奋吧,一天一点,努力提高基本技能。
  • 原文地址:https://www.cnblogs.com/huy360/p/4758979.html
Copyright © 2011-2022 走看看