user2997204
user2997204

Reputation: 1384

Modifying HTML and JSP

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>

Upvotes: 1

Views: 734

Answers (1)

code_angel
code_angel

Reputation: 1537

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.

Upvotes: 1

Related Questions