在servletfilter中正确的使用重定向

Posted zshjava

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在servletfilter中正确的使用重定向相关的知识,希望对你有一定的参考价值。

在filter中使用重定向时要注意,在重定向后不需要在调用 filterChain.doFilter()。因为过滤已经结束了再调用的话会产生getWriter()方法非法使用的错误

 1 package com.zsh.project.exam.config;
 2 
 3 import javax.servlet.*;
 4 import javax.servlet.annotation.WebFilter;
 5 import javax.servlet.http.HttpServletRequest;
 6 import javax.servlet.http.HttpServletResponse;
 7 import javax.servlet.http.HttpSession;
 8 import java.io.IOException;
 9 
10 /**
11  * @author shihai.zhang
12  * @date 2019/3/19 0019
13  */
14 @WebFilter(urlPatterns = {"/student/*" ,"/teacher/*"})
15 public class SecurityFilter implements Filter {
16     @Override
17     public void init(FilterConfig filterConfig) throws ServletException {
18 
19     }
20 
21     /**
22      * 在filter中进行重定向时需要用if else 不然会导致 getWriter()被非法调用的错误
23      * @param servletRequest
24      * @param servletResponse
25      * @param filterChain
26      * @throws IOException
27      * @throws ServletException
28      */
29     @Override
30     public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
31         HttpServletRequest httpServletRequest=(HttpServletRequest)servletRequest;
32         HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse;
33         HttpSession httpSession = httpServletRequest.getSession();
34         if(httpSession.getAttribute("userName")==null){
35             ((HttpServletResponse) servletResponse).sendRedirect("login");
36         }else{
37             filterChain.doFilter(servletRequest, servletResponse);
38         }
39     }
40 
41     @Override
42     public void destroy() {
43 
44     }
45 }

注:在jsp中地址最好用<:ulr>来产生URL,否则当地址栏地址变了之后上下文也会变,会导致错误

以上是关于在servletfilter中正确的使用重定向的主要内容,如果未能解决你的问题,请参考以下文章

在 servlet 重定向之前使用过滤器修改响应 URL (Java/Tomcat)

维护页面重定向的正确状态代码?

django重定向导致重定向到下一页,但然后返回原始?

用于重定向无效路由的正确状态代码

正确登录后如何重定向用户?

在 NextJS 中自动重定向的正确方法