如何从servlet过滤器返回HTTP错误代码?

Art*_*mal 3 java servlet-filters

我的Web应用程序中有页面,只有管理员才能访问.我写过滤器,但我不明白如果用户不是管理员,如何从过滤器返回HTTP错误代码(403).

public class AdminFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        String username = servletRequest.getParameter("username");
        String password = servletRequest.getParameter("password");

        UserDao userDaoImpl = new UserDaoImpl();
        if(userDaoImpl.findByUsername(username).getPassword().equals(password)) {
            filterChain.doFilter(servletRequest, servletResponse);
        } else {
            //respond with 403
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道我可以重定向到我的自定义403页面,但我想知道如何返回HTTP错误代码.

Rom*_*kiy 14

你需要转换servletResponseHttpServletResponse第一:

HttpServletResponse response = (HttpServletResponse) servletResponse;
Run Code Online (Sandbox Code Playgroud)

然后使用它的sendError()方法:

response.sendError(HttpServletResponse.SC_FORBIDDEN);
Run Code Online (Sandbox Code Playgroud)

SC_FORBIDDEN 代表代码403.

顺便说一下,你没有重定向到403页面,你只需回复那个状态.如果这样做,servlet容器将向用户提供特殊的403页面.您可以在以下位置配置该页面web.xml:

<error-page>
    <error-code>403</error-code>
    <location>/error-403.htm</location>
</error-page>
Run Code Online (Sandbox Code Playgroud)

这会指示容器/error-403.htm在设置403状态时为您的自定义页面提供服务.

如果您想要重定向,可以使用response.sendRedirect()(它发出302重定向).