/
TestFilter.java
104 lines (90 loc) · 3.32 KB
/
TestFilter.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
//
// ========================================================================
// Copyright (c) 1995-2021 Mort Bay Consulting Pty Ltd and others.
//
// This program and the accompanying materials are made available under the
// terms of the Eclipse Public License v. 2.0 which is available at
// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
// which is available at https://www.apache.org/licenses/LICENSE-2.0.
//
// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
// ========================================================================
//
package com.acme;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestWrapper;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
/**
* TestFilter.
*
* This filter checks for a none local request, and if the init parameter
* "remote" is not set to true, then all non local requests are forwarded
* to /remote.html
*/
public class TestFilter implements Filter
{
private boolean _remote;
private ServletContext _context;
private final Set<String> _allowed = new HashSet<String>();
@Override
public void init(FilterConfig filterConfig) throws ServletException
{
_context = filterConfig.getServletContext();
_remote = Boolean.parseBoolean(filterConfig.getInitParameter("remote"));
_allowed.add("/favicon.ico");
_allowed.add("/jetty_banner.gif");
_allowed.add("/remote.html");
filterConfig.getServletContext().log("TestFilter#remote=" + _remote);
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException
{
String from = request.getRemoteAddr();
String to = request.getLocalAddr();
String path = ((HttpServletRequest)request).getServletPath();
if (!_remote && !_allowed.contains(path) && !from.equals(to))
{
_context.getRequestDispatcher("/remote.html").forward(request, response);
return;
}
Integer oldValue = null;
ServletRequest r = request;
while (r instanceof ServletRequestWrapper)
{
r = ((ServletRequestWrapper)r).getRequest();
}
try
{
oldValue = (Integer)request.getAttribute("testFilter");
Integer value = (oldValue == null) ? 1 : oldValue + 1;
request.setAttribute("testFilter", value);
String qString = ((HttpServletRequest)request).getQueryString();
if (qString != null && qString.indexOf("wrap") >= 0)
{
request = new HttpServletRequestWrapper((HttpServletRequest)request);
}
_context.setAttribute("request" + r.hashCode(), value);
chain.doFilter(request, response);
}
finally
{
request.setAttribute("testFilter", oldValue);
_context.setAttribute("request" + r.hashCode(), oldValue);
}
}
@Override
public void destroy()
{
}
}