Member 12888828 Ответов: 0

Как добавить добавить дополнительный файл cookie, используя имя фильтра в качестве имени файла cookie, а содержимое этого файла cookie - мое имя.


Для проекта я должен
1. измените web.xml чтобы отключить три тестовых фильтра фильтра и включить фильтр LogResponsesCookiesFilter.
2.Изменить LogResponsesCookiesFilter. Фильтр, который я реализовал, должен добавить дополнительный файл cookie, используя имя фильтра в качестве имени файла cookie. Содержимым этого куки будет мое имя.
Я уже сделал первый шаг. Мне нужна помощь с шагом 2.

Что я уже пробовал:

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" 

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                        http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    <filter>
        <filter-name>TestFilter1</filter-name>
        <filter-class>filter.TestFilter1</filter-class>
    </filter>
    <filter>
        <filter-name>TestFilter2</filter-name>
        <filter-class>filter.TestFilter2</filter-class>
    </filter>
    <filter>
        <filter-name>TestFilter3</filter-name>
        <filter-class>filter.TestFilter3</filter-class>
    </filter>
    <filter>
        <filter-name>TestInitParamsFilter</filter-name>
        <filter-class>filter.TestInitParamsFilter</filter-class>
        <init-param>
            <param-name>logFilename</param-name>
            <param-value>test_init_params.log</param-value>
        </init-param>
    </filter>
    <filter>
        <filter-name>LogRequestFilter</filter-name>
        <filter-class>murach.filters.LogRequestFilter</filter-class>
    </filter>
    <filter>
        <filter-name>LogResponseFilter</filter-name>
        <filter-class>murach.filters.LogResponseFilter</filter-class>
    </filter>
    <filter>
        <filter-name>LogResponseCookiesFilter</filter-name>
        <filter-class>murach.filters.LogResponseCookiesFilter</filter-class>
    </filter>
    <!--
    <filter-mapping>
        <filter-name>TestFilter1</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>TestFilter2</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
    </filter-mapping>
    <filter-mapping>
        <filter-name>TestFilter3</filter-name>
        <servlet-name>DownloadServlet</servlet-name>
    </filter-mapping>
    <filter-mapping>
        <filter-name>TestInitParamsFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    -->
    <!-- 
    <filter-mapping>
        <filter-name>LogResponseFilter</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
    </filter-mapping>
    -->
    <filter-mapping>
        <filter-name>LogResponseCookiesFilter</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
    </filter-mapping>
    <servlet>
        <servlet-name>DownloadServlet</servlet-name>
        <servlet-class>download.DownloadServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>DownloadServlet</servlet-name>
        <url-pattern>/download</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>


LogResponsesCookiesFilter.java

package filter;

import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class LogResponseCookiesFilter implements Filter {

    private FilterConfig filterConfig = null;

    @Override
    public void init(FilterConfig filterConfig) {
        this.filterConfig = filterConfig;
    }

    @Override
    public void doFilter(
            ServletRequest request,
            ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        
        HttpServletResponse httpResponse = (HttpServletResponse) response;
        ResponseCookiesWrapper wrappedResponse
                = new ResponseCookiesWrapper(httpResponse);

        chain.doFilter(request, wrappedResponse);

        HttpServletRequest httpRequest = (HttpServletRequest) request;
        ServletContext sc = filterConfig.getServletContext();
        String filterName = filterConfig.getFilterName();
        String servletPath = "Servlet path: " + httpRequest.getServletPath();
        ArrayList<Cookie> cookies = wrappedResponse.getCookies();
        String cookiesString = "";
        for (Cookie c : cookies) {
            cookiesString += c.getName() + "=" + c.getValue() + " ";
        }

        sc.log(filterName + " | " + servletPath + " | cookies: "
                + cookiesString);
    }

    @Override
    public void destroy() {
        filterConfig = null;
    }

    class ResponseCookiesWrapper extends HttpServletResponseWrapper {

        private ArrayList<Cookie> cookies = null;

        public ResponseCookiesWrapper(HttpServletResponse response) {
            super(response);
            cookies = new ArrayList<Cookie>();
        }

        // provide a new method for the ResponseWrapper class
        public ArrayList<Cookie> getCookies() {
            return cookies;
        }

        // override the addCookie method of the HttpServletResponse object
        @Override
        public void addCookie(Cookie cookie) {
            // store the cookie in the response wrapper object
            cookies.add(cookie);

            // store the cookie in the original response object
            HttpServletResponse httpResponse
                    = (HttpServletResponse) this.getResponse();
            httpResponse.addCookie(cookie);
        }
    }
}

0 Ответов