【问题标题】:ways to get meta info of servlet in filter?如何在过滤器中获取 servlet 的元信息?
【发布时间】:2020-08-14 10:31:48
【问题描述】:

我想以声明的方式给servlet方法添加权限,例如:

// servlet
@Perms("admin", "finance")
public void doPost(servletRequest req, servletResponse res) {
   ...
}
// web filter
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {
   List<String> allowedRoles = ... // somehow get values from @Perms
} 

可能还有其他方法可以在没有注释的情况下执行此操作,这只是我想要做什么的示例。

或者更抽象的例子:

@WebServlet("/someaddress")

// servlet
@What("have a nice day")
public void doPost(servletRequest req, servletResponse res) {
   ...
}
@WebFilter("/*")
// web filter
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {
   String msg = ... // somehow get values from @What
} 

【问题讨论】:

  • 你读过关于注解的教程了吗?
  • @ThorbjørnRavnAndersen 是的,如果在我的示例中使用注释,我不知道如何获取请求转到的特定注释方法的值 => 不知道如何获取特定 servlet来自网络过滤器的方法。
  • @JoopEggen 我的问题是如何从网络过滤器中获取元信息(或特定的 servlet)
  • @ЕгорЛебедев 是的,这有点棘手stackoverflow.com/questions/21307477/…

标签: java servlets


【解决方案1】:

解决办法

  1. 声明注释
@Retention(RetentionPolicy.RUNTIME)
public @interface What {
    String[] value();
}
  1. 覆盖 servlet 中的 init 方法(我认为声明另一个所有 servlet 都将使用该 init 继承的类会很有用)
    @Override
    public void init() throws ServletException {
        ServletContext ctx = this.getServletContext();
        final Class[] sFormalArgs = {HttpServletRequest.class,HttpServletResponse.class};
        try {
            Method m = this.getClass().getDeclaredMethod("doGet", sFormalArgs); // do the same with other methods
            What a = m.getAnnotation(What.class);
            String[] value = a.value();
            ctx.setAttribute("someStuff", value);

        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
    }
  1. 为方法添加注释
    @What({"admin", "finance"})
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
    {
        ....
    }
  1. 在网络过滤器中获取它
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain
    ) {
        HttpServletRequest req = (HttpServletRequest) servletRequest;
        ServletContext ctx = req.getServletContext();
        Object o = ctx.getAttribute("someStuff");
    }

不要忘记处理错误和多线程问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-14
    • 1970-01-01
    • 2017-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-04
    • 1970-01-01
    相关资源
    最近更新 更多