【问题标题】:Servlet filter change response?Servlet过滤器更改响应?
【发布时间】:2013-11-25 15:13:40
【问题描述】:

我有以下 servlet 过滤器。

public class MyFilter extends BaseServletRequestFilter {

        @Override
    protected void afterExecutingFilterChain(final ServletRequest requset, FilterResponseWrapper response) throws ServletException {

//To do
    }

       @Override
    protected void beforeExecutingFilterChain(final ServletRequest requset, final FilterResponseWrapper response) throws ServletException{

    //Here request needs to be intercepted
   //To do
}


}

我有以上过滤器。我的要求是我需要拦截请求。我需要检查请求中的一些布尔值。如果布尔变量为真,则应继续请求处理。如果布尔变量为假,则请求不应继续,我需要发送一些自定义响应,如下所示。

public enum CustomStatus {


    OK("Ok"),

    BAD_REQUEST("BadRequest");

    private final String value;

    CustomStatus(String v) {
        value = v;
    }

    public String value() {
        return value;
    }

    public static CustomStatus fromValue(String v) {
        for (CustomStatus c: CustomStatus.values()) {
            if (c.value.equals(v)) {
                return c;
            }
        }
        throw new IllegalArgumentException(v);
    }

}

如果请求布尔变量的值为假,那么我必须将上述自定义状态设置为响应并返回而不处理请求。我该怎么做?

谢谢!

【问题讨论】:

    标签: java servlets


    【解决方案1】:

    如果你通过扩展Filter创建Filter,你可以这样做:

    public void  doFilter(ServletRequest request, 
          ServletResponse response, 
            FilterChain chain)
            if(your status is ok) {
                chain.doFilter(request, response);
            } else {
                ((HttpServletResponse) response).sendError(the error code,
                                    "the error message" );                          
            }
    }
    

    【讨论】:

    • 感谢您的回复。我不想发送任何错误。我可以发送自定义响应作为我的自定义状态吗?谢谢!
    • 你可以在HttpServletResponse上使用setStatus(int)方法
    • 有什么办法可以发送我的 CustomStatus 吗?谢谢!
    【解决方案2】:

    使用过滤器界面:

    public final class XssFilter implements Filter {
    
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
      throws IOException, ServletException
    {
        //check request...
        if (ok) {
           chain.doFilter(request, response);
        } else {
           // do something with the response
        }
    }
    

    不能更具体,因为您没有准确说明您正在检查的布尔值在哪里(是参数,还是 URL 的一部分,还是 cookie,还是标头?),也没有你准确地说出你想要对响应做什么。

    【讨论】:

    • 感谢您的回复。我可以发送我的 CustomStatus 作为回复吗?
    • 不是直接的。响应将是一个 HttpServletResponse,其中包含返回给浏览器的所有信息。您可以使用 ObjectOutputStream 和 HttpServletResponse.getOutputStream() 将 CustomStatus 序列化到响应中,但这非常先进。设置状态更容易,例如响应.setStatus(403)。您还可以在标题中设置一些文本(response.setHeader(name, value))。
    猜你喜欢
    • 2017-10-20
    • 2014-04-17
    • 1970-01-01
    • 2015-11-11
    • 2017-06-25
    • 2015-10-28
    • 2016-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多