1

How can I add a HTML comment on every HTML and JSP page?

I've tried to modify it with a filter and it could only modify the JSP pages and not the HTML pages.

I used a filter like this:

package com.app.server.filter;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import java.io.CharArrayWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

public class WaterMarkFilter implements Filter {

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

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        String[] extensions = filterConfig.getInitParameter("extensionsToFilter").split(",");
        for (String extension : extensions) {
            extensionsToFilter.add(extension.trim());
        }
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        chain.doFilter(request, response);
        postFilter(request, response);
    }

    @Override
    public void destroy() {

    }

    private void postFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException {
        String path = ((HttpServletRequest) request).getRequestURI();
        if (canIntercept(path)) {
            response.getWriter().write("modified");
            response.getWriter().close();
        }
    }

    private boolean canIntercept(String path) {
        if (path.equals("/")) {
            return true;
        }
        for (String extension : extensionsToFilter) {
            if (path.endsWith("." + extension)) {
                return true;
            }
        }
        return false;
    }

}

This is the Web.xml file:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
             version="3.1">

        <servlet>
            <servlet-name>com.app.configuration ShoppingCartService</servlet-name>
            <servlet-class>com.app.server.servlet.ShoppingCartServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>com.app.configuration ShoppingCartService</servlet-name>
            <url-pattern>/application/ShoppingCartServlet</url-pattern>
        </servlet-mapping>

        <servlet>
            <servlet-name>test</servlet-name>
            <servlet-class>com.app.server.servlet.TestServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>test</servlet-name>
            <url-pattern>/application/test</url-pattern>
        </servlet-mapping>

        <listener>
        <listener-class>com.app.server.ApplicationInitializer</listener-class>
    </listener>

    <filter>
        <filter-name>WaterMarkFilter</filter-name>
        <filter-class>com.app.server.filter.WaterMarkFilter</filter-class>
        <init-param>
            <param-name>extensionsToFilter</param-name>
            <param-value>jsp, html</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>WaterMarkFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

</web-app>
user2997204
  • 1,344
  • 2
  • 12
  • 24
  • Please edit and post the full code for your filter, your web.xml (if the filter is declared in here). –  Jan 15 '17 at 17:34
  • @RC. added, I hope you can find something – user2997204 Jan 15 '17 at 18:53
  • I think the problem is that you "chain" to the next filter before doing stuff –  Jan 15 '17 at 19:15
  • @user2997204 check my answer(s). I tested it. It works fine. If it works for you too, don't forget to upvote and accept my answers – code_angel Jan 25 '17 at 22:08
  • Glad that works. Did you also consider a template system like Tiles and just add it there? Might make sense depending on how you're trying to separate concerns. – riddle_me_this Jan 25 '17 at 22:16

1 Answers1

1

The actual question is how to manipulate the ServletResponse using Filter.
My detailed answer with full code example and many links is here

Short:
In the doFilter implementation:

  1. before the chain.doFilter call, prepare a HttpServletResponseWrapper and a PrintWriter
  2. after the call, write in the PrintWriter a copy of the wrapped response + "the text you want"

Bellow are the code changes in order the filter to work with HTML too:

public class WaterMarkFilter implements Filter {

    private ServletRequest request;
    private PrintWriter out;
    private CharResponseWrapper wrapper;

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
               throws IOException, ServletException {

        this.request = request; 
        out = response.getWriter();
        wrapper = new CharResponseWrapper((HttpServletResponse) response);

        chain.doFilter(request, wrapper);

        postFilter();

        out.close();
    }

    private void postFilter() throws IOException, ServletException {
        String path = ((HttpServletRequest) request).getRequestURI();
        if (canIntercept(path)) {
            out.write(wrapper.toString() + "modified");
        }
        else {
            out.write(wrapper.toString());
        }
    }
}

The CharResponseWrapper is the same as in my detailed answer here.
There is also a better example how to include text into already created html.
Just adding text at the end is good only for plain text files.
For HTML - It is better to insert the text inside the HTML. The example there is with <head> tag, but it could be adapted to insert to <body> tag.

Community
  • 1
  • 1
code_angel
  • 1,537
  • 1
  • 11
  • 21