当前位置: 首页 > 面试题库 >

如何使用嵌入式码头添加servlet过滤器

羊越
2023-03-14
问题内容

我将jetty嵌入到我的应用程序中,并尝试找出如何添加servlet过滤器(用于cookie处理)。Wiki和javadoc的含义不明确,我缺少什么:

Server server = new Server(port);
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath("/");
FilterHolder f = new FilterHolder(new AuthorisationFilter());
context.addFilter(... f ...); // ?????
context.addServlet(new ServletHolder(new TestServlet()), "/");

我在此找到的唯一信息是一个论坛帖子,建议对此文档进行改进。


问题答案:

更新:对于Jetty版本9.2.2:

    Server server = new Server();

    // Note: if you don't want control over type of connector, etc. you can simply 
    // call new Server(<port>);
    ServerConnector connector = new ServerConnector(server);
    connector.setHost("0.0.0.0");
    connector.setPort(8085);
    // Setting the name allows you to serve different app contexts from different connectors.
    connector.setName("main");
    server.addConnector(connector);

    WebAppContext context = new WebAppContext();
    context.setContextPath("/");
    // For development within an IDE like Eclipse, you can directly point to the web.xml
    context.setWar("src/main/webapp");
    context.addFilter(MyFilter.class, "/", 1);

    HandlerCollection collection = new HandlerCollection();
    RequestLogHandler rlh = new RequestLogHandler();
    // Slf4j - who uses anything else?
    Slf4jRequestLog requestLog = new Slf4jRequestLog();
    requestLog.setExtended(false);
    rlh.setRequestLog(requestLog);
    collection.setHandlers(new Handler[] { context, rlh });
    server.setHandler(collection);

    try {
        server.start();
        server.join();
    } catch (Exception e) {
        // Google guava way
        throw Throwables.propagate(e);
    }

原始答案===

如果您不想使用web.xml,请使用以下命令:

SocketConnector socketConnector = new SocketConnector();
socketConnector.setPort(7000); // Change to port you want
Server server.setConnectors(new Connector[] { socketConnector });

WebAppContext webapp = new WebAppContext();

webapp.setContextPath("/"); // For root
webapp.setWar("/"); // Appropriate file system path.

// Now you can use the various webapp.addFilter() methods
webapp.addFilter(MyFilter.class, "/test", 1); // Will serve request to /test.
// There are 3 different addFilter() variants.

// Bonus ... request logs.
RequestLogHandler logHandler = new RequestLogHandler();
NCSARequestLog requestLog = new NCSARequestLog("/tmp/jetty-yyyy_mm_dd.request.log");
requestLog.setRetainDays(90);
requestLog.setAppend(true);
requestLog.setExtended(false);
requestLog.setLogTimeZone("GMT");
logHandler.setRequestLog(requestLog);

logHandler.setHandler(webapp);

HandlerList handlerList = new HandlerList();
handlerList.addHandler(logHandler);

server.setHandler(handlerList);

server.start();

如果确实要使用web.xml而不是addFilter()方法,只需确保您的webapp根路径中具有WEB-INF / web.xml并使用以下xml:

<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app
   PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
   "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
    <filter>
        <filter-name>filterName</filter-name>
        <filter-class>com.x.y.z.FilterClass</filter-class>
    </filter>
    <filter-mapping>
        <url-pattern>/test</url-pattern>
        <filter-name>filterName</filter-name>
    </filter-mapping>
</web-app>


 类似资料:
  • 问题内容: 我正在使用嵌入式Jetty,我想添加一个servlet过滤器以在每个请求之前检查身份验证。我尝试按照以下示例进行操作,但签名似乎已更改。 我的Jetty启动器看起来像这样: 当我取消注释 我发现签名已更改。因此,我想退一步,问一问,对于嵌入式Jetty,如何添加一个在请求开始时运行的过滤器,并仅在满足某些条件时才允许请求继续进行? AuthenticationFilter类的开始看起来

  • 问题内容: 尽管我看过很多类似的问题,但没有找到明确的答案。使用Servlet Spec 2.5,是否可以以编程方式添加Servlet过滤器和映射?首选位置在Servlet.init()或ServletContextListener.contextInitialized()中。 问题答案: 不,不是通过标准的Servlet 2.5 API。这是在Servlet 3.0 中引入的。最好的选择是创建一

  • 问题内容: 我正在与现有的servlet集成,该servlet从HTTP标头中提取一些属性。基本上,我实现的接口无法访问实际请求,它只能访问HTTP标头的k-> v映射。 我需要传递一个请求参数。计划是使用servlet过滤器从参数到标头值,但是HttpServletRequest对象当然没有addHeader()方法。 有任何想法吗? 问题答案: Extend ,覆盖标头吸气剂以返回参数: ..

  • 问题内容: 我正在尝试通过Web应用程序以及带有嵌入式码头的自包含jar文件引发战争。对于嵌入式码头(jar文件分发),我添加了一个servlet,如下所示: war文件分发使用web.xml文件,该文件在web-app部分包含以下内容: 这可行。但是,我想摆脱两种方法之间的重复。即,当我添加一个新的servlet时,我只想在一个位置进行配置。我可以从嵌入式码头加载和使用web.xml文件吗? 问

  • 我需要在每个响应中添加标题。我正打算在下面做 我想在之后这样做,以便一旦控制器处理它,我只是在返回客户端之前添加标头。是正确的吗? 但如何编写响应过滤器? 在已返回,对响应执行任何操作都为时已晚。此时,整个响应已经发送到客户端,您的代码无法访问它。 我觉得上面的说法不对。我不能在过滤链之后添加标题。doFilter(请求、响应)?如果不是,为什么? 我使用的是spring mvc。

  • 本文向大家介绍Java如何使用Jetty实现嵌入式的Servlet容器,包括了Java如何使用Jetty实现嵌入式的Servlet容器的使用技巧和注意事项,需要的朋友参考一下 最近在项目中遇到关于jetty的问题,所以在网上做一些科普,接下来就给大家做一些分享: Jetty是一个Java实现的开源的servlet容器,它既可以像Tomcat一样作为一个完整的Web服务器和Servlet容器,同时也