简体   繁体   English

如何在 servlet 过滤器中重定向?

[英]How to redirect in a servlet filter?

I'm trying to find a method to redirect my request from a filter to the login page but I don't know how to redirect from servlet.我试图找到一种方法将我的请求从过滤器重定向到登录页面,但我不知道如何从 servlet 重定向。 I've searched but what I find is sendRedirect() method.我已经搜索过,但我发现的是sendRedirect()方法。 I can't find this method on my response object in the filter.我在过滤器中的响应对象上找不到此方法。 What's the cause?原因是什么? How can I solve this?我该如何解决这个问题?

In Filter the response is of ServletResponse rather than HttpServletResponse .在 Filter 中,响应是ServletResponse而不是HttpServletResponse Hence do the cast to HttpServletResponse .因此对HttpServletResponse

HttpServletResponse httpResponse = (HttpServletResponse) response;
httpResponse.sendRedirect("/login.jsp");

If using a context path:如果使用上下文路径:

httpResponse.sendRedirect(req.getContextPath() + "/login.jsp");

Also don't forget to call return;也不要忘记调用return; at the end.在末尾。

I'm trying to find a method to redirect my request from filter to login page我正在尝试找到一种方法将我的请求从过滤器重定向到登录页面

Don't

You just invoke你只要调用

chain.doFilter(request, response);

from filter and the normal flow will go ahead.来自过滤器,正常流程将继续。

I don't know how to redirect from servlet我不知道如何从 servlet 重定向

You can use您可以使用

response.sendRedirect(url);

to redirect from servlet从servlet重定向

If you also want to keep hash and get parameter, you can do something like this (fill redirectMap at filter init):如果您还想保留哈希并获取参数,您可以执行以下操作(在过滤器初始化时填充 redirectMap):

String uri = request.getRequestURI();

String[] uriParts = uri.split("[#?]");
String path = uriParts[0];
String rest = uri.substring(uriParts[0].length());

if(redirectMap.containsKey(path)) {
    response.sendRedirect(redirectMap.get(path) + rest);
} else {
    chain.doFilter(request, response);
}

Try and check of your ServletResponse response is an instanceof HttpServletResponse like so:尝试检查您的ServletResponse responseinstanceof HttpServletResponse一个instanceof HttpServletResponse如下所示:

if (response instanceof HttpServletResponse) {
    response.sendRedirect(....);
}

Your response object is declared as a ServletResponse .您的响应对象被声明为ServletResponse To use the sendRedirect() method, you have to cast it to HttpServletResponse .要使用sendRedirect()方法,您必须将其转换为HttpServletResponse This is an extended interface that adds methods related to the HTTP protocol.这是一个扩展接口,添加了与 HTTP 协议相关的方法。

why are you using response object .你为什么使用响应对象。 it is a ServletResponse Object ,it does not provide sendRedirect() method .它是一个 ServletResponse 对象,它不提供 sendRedirect() 方法。 instead use request object of ServletRequest to forward the request .而是使用 ServletRequest 的请求对象来转发请求

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // TODO Auto-generated method stub
        // place your code here

        request.getRequestDispatcher("login.html").forward(request,response);
        return;
        
    }

see javadocjavadoc

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM