【发布时间】:2011-07-15 14:14:53
【问题描述】:
我正在尝试找到一种方法将我的请求从过滤器重定向到登录页面,但我不知道如何从 servlet 重定向。我已经搜索过,但我发现的是sendRedirect() 方法。我在过滤器中的响应对象上找不到此方法。原因是什么?我该如何解决这个问题?
【问题讨论】:
标签: java servlets redirect servlet-filters
我正在尝试找到一种方法将我的请求从过滤器重定向到登录页面,但我不知道如何从 servlet 重定向。我已经搜索过,但我发现的是sendRedirect() 方法。我在过滤器中的响应对象上找不到此方法。原因是什么?我该如何解决这个问题?
【问题讨论】:
标签: java servlets redirect servlet-filters
在过滤器中,响应是ServletResponse 而不是HttpServletResponse。因此对HttpServletResponse进行强制转换。
HttpServletResponse httpResponse = (HttpServletResponse) response;
httpResponse.sendRedirect("/login.jsp");
如果使用上下文路径:
httpResponse.sendRedirect(req.getContextPath() + "/login.jsp");
最后别忘了给return;打电话。
【讨论】:
我正在尝试找到一种方法将我的请求从过滤器重定向到登录页面
不要
你只需调用
chain.doFilter(request, response);
来自过滤器,正常流程将继续进行。
我不知道如何从 servlet 重定向
你可以使用
response.sendRedirect(url);
从 servlet 重定向
【讨论】:
response 的类型为 ServletResponse,应转换为 HttpServletResponse。示例:HttpServletResponse resp = (HttpServletResponse) response;resp.sendRedirect("templateName || pathName");
如果你还想保留 hash 和 get 参数,你可以这样做(在 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);
}
【讨论】:
尝试检查您的ServletResponse response 是否为instanceof HttpServletResponse,如下所示:
if (response instanceof HttpServletResponse) {
response.sendRedirect(....);
}
【讨论】:
public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
你为什么使用响应对象。它是一个 ServletResponse 对象,它不提供 sendRedirect() 方法。而是使用 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;
}
【讨论】:
您的响应对象被声明为ServletResponse。要使用sendRedirect() 方法,您必须将其转换为HttpServletResponse。这是一个扩展接口,增加了与HTTP协议相关的方法。
【讨论】:
public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {