gpt4 book ai didi

java - 如何外部化 web.xml servlet init-param?用于 Servlet 的 Spring DelegatingFilterProxy?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:07:46 29 4
gpt4 key购买 nike

我有一个无法修改的第 3 方 servlet。它接受一个我想外部化的 init-param(来自 web.xml)。

我可以使用 DelegatingFilterProxy 外部化一个 servlet 过滤器 init-param .这有效地将 servlet 过滤器定义移到了 Spring 中,那里有更强大的外部化工具(例如:PropertyPlaceholderConfigurer、环境变量等)

我如何为 servlet 执行此操作?

最佳答案

看起来您需要一个 DelegatingServletProxy 类,尽管这在 Spring 中不存在。但是,我认为使用 DelegatingFilterProxy 作为起点进行编码非常简单。

一个 servlet 只实现少数具体方法,因此委托(delegate)应该很简单。

好吧,我把钱放在嘴边!编辑:下面是 DelegatingServletProxy 的基本实现。

你可以这样使用它:

  1. 在 web.xml 中设置常用的 spring 上下文配置/ContextListener,为您的 webapp 设置应用程序范围的 spring 上下文。
  2. 在您的 web.xml 中添加一个 servlet,其实现类就是这个 DelegatingServletProxy。这将替换您要为其更改 init-params 的现有 serlvet。您为这个新的 servlet 设置了初始化参数:proxyServletClass 是您的 servlet 类的名称。 proxyServletParams 是 spring 配置中的 Properties bean 的名称。此属性 bean 用于设置代理 servlet 的初始化参数。
  3. 在您的 spring 配置中,添加一个定义 init-params 的新 Properites bean

一些例子,在spring应用上下文中

<bean name="myInitParams" class="java.util.Properties">
<constructor-arg>
<props>
<prop key="initParamName">initParamValue</prop>
</props>
</constructor-arg>
</bean>

示例 web.xml 片段

<servlet>
<servlet-name>...</servlet-name>
<servlet-class>
acme.DelegatingServletProxy
</servlet-class>
<init-param>
<param-name>proxyServletClass</param-name>
<param-value>your.original.servlet.ServletClass</param-value>
</init-param>
<init-param>
<param-name>proxyServletParams</param-name>
<param-value>myServletParams</param-value>
<!-- name of bean in spring context -->
</init-param>
</servlet>

这是 servlet 代码,它很长,但大部分是委托(delegate) ServletContext - 有趣的事情发生在顶部。它未经测试 - 应该被视为一个起点。

import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import javax.servlet.*;
import javax.servlet.http.HttpServlet;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Enumeration;
import java.util.Properties;
import java.util.Set;

public class DelegatingServletProxy extends HttpServlet implements WebApplicationContextAware
{
private HttpServlet delegate;

private Properties initParams;
private String delegateName;

public void setDelegateName(String delegateName)
{
this.delegateName = delegateName;
}

public void init(ServletConfig config) throws ServletException
{
super.init(config);
WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
delegate = wac.getBean(delegateName, HttpServlet.class);
delegate.init(new WrapServletConfig(config));
}

@Override
public void destroy()
{
delegate.destroy();
}

@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException
{
delegate.service(req, res);
}

public void setInitParams(Properties initParams)
{
this.initParams = initParams;
}

private class WrapServletConfig implements ServletConfig, ServletContext
{
// we override ServletContext also because it exposes getInitParameterNames()/getInitParemter()
private ServletConfig delegate;
private ServletContext delegateContext;
public WrapServletConfig(ServletConfig config)
{
this.delegate = config;
this.delegateContext = config.getServletContext();
}

@Override
public String getServletName()
{
return delegate.getServletName();
}

@Override
public ServletContext getServletContext()
{
return delegate.getServletContext();
}

@Override
public String getInitParameter(String s)
{
return initParams.getProperty(s);
}

@Override
public Enumeration getInitParameterNames()
{
return initParams.propertyNames();
}

@Override
public Object getAttribute(String s)
{
return delegateContext.getAttribute(s);
}

@Override
public Enumeration getAttributeNames()
{
return delegateContext.getAttributeNames();
}

@Override
public void setAttribute(String s, Object o)
{
delegateContext.setAttribute(s, o);
}

@Override
public void removeAttribute(String s)
{
delegateContext.removeAttribute(s);
}

@Override
public String getServletContextName()
{
return delegateContext.getServletContextName();
}

// the remainer is just straight delegation to ServletContext

@Override
public ServletContext getContext(String s)
{
return delegateContext.getContext(s);
}

@Override
public int getMajorVersion()
{
return delegateContext.getMajorVersion();
}

@Override
public int getMinorVersion()
{
return delegateContext.getMinorVersion();
}

@Override
public String getMimeType(String s)
{
return delegateContext.getMimeType(s);
}

@Override
public Set getResourcePaths(String s)
{
return delegateContext.getResourcePaths(s);
}

@Override
public URL getResource(String s)
throws MalformedURLException
{
return delegateContext.getResource(s);
}

@Override
public InputStream getResourceAsStream(String s)
{
return delegateContext.getResourceAsStream(s);
}

@Override
public RequestDispatcher getRequestDispatcher(String s)
{
return delegateContext.getRequestDispatcher(s);
}

@Override
public RequestDispatcher getNamedDispatcher(String s)
{
return delegateContext.getNamedDispatcher(s);
}

@Override
public Servlet getServlet(String s)
throws ServletException
{
return delegateContext.getServlet(s);
}

@Override
public Enumeration getServlets()
{
return delegateContext.getServlets();
}

@Override
public Enumeration getServletNames()
{
return delegateContext.getServletNames();
}

@Override
public void log(String s)
{
delegateContext.log(s);
}

@Override
public void log(Exception e, String s)
{
delegateContext.log(e, s);
}

@Override
public void log(String s, Throwable throwable)
{
delegateContext.log(s, throwable);
}

@Override
public String getRealPath(String s)
{
return delegateContext.getRealPath(s);
}

@Override
public String getServerInfo()
{
return delegateContext.getServerInfo();
}
}
}

关于java - 如何外部化 web.xml servlet init-param?用于 Servlet 的 Spring DelegatingFilterProxy?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2845649/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com