关于filter内代码的相关问题

关于filter内代码的相关问题

public class AdminFilter implements Filter {
    @Autowired
    private UserService userService;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
            throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpSession session = request.getSession();
        User loginUser = (User) session.getAttribute(Constant.LOGIN_USER);
        if(loginUser == null) {
            print(servletResponse, BusinessExceptionEum.NEED_LOGIN);
            return;
        }
        if (userService.checkAdminRole(loginUser)) {
            filterChain.doFilter(servletRequest, servletResponse);
        } else {
            print(servletResponse, BusinessExceptionEum.ACCESS_DENY);
        }
    }

    @Override
    public void destroy() {
    }

    private void print(ServletResponse servletResponse,
                         BusinessExceptionEum businessExceptionEum) throws IOException {
            PrintWriter out = new HttpServletResponseWrapper((HttpServletResponse) servletResponse).getWriter();
        out.write("{\n"
                + "    \"status\": "+ businessExceptionEum.getCode() + ",\n"
                + "    \"msg\": \"" + businessExceptionEum.getMsg() + "\",\n"
                + "    \"data\": null\n"
                + "}");
        out.flush();
        out.close();
    }
}



问题描述:

  • HttpServletResponseWrapper.getWritter.write中如果输出中文字符会出现乱码,请问如何解决

  • 被Filter拦截的数据就不能在WebLogAspect捕捉了,要想被这个Aspect拦截,要怎么操作,是要加什么JoinCut吗?

public class WebLogAspect {
    private final Logger log = LoggerFactory.getLogger(WebLogAspect.class);
    @Pointcut("execution (public * i3kp0d.proj.work.mall.controller.*.*(..))")
    public void webLog() {

    }

    @Before("webLog()")
    public void doBefore(JoinPoint joinPoint) {
        ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = requestAttributes.getRequest();

        log.info("URL : " + request.getRequestURI());
        log.info("HTTP_METHOD : " + request.getMethod());
        log.info("IP : " + request.getRemoteAddr());
        log.info("CLASS_METHOD : " + joinPoint.getSignature().getName() + "." + joinPoint.getSignature().getName());
        log.info("ARGS : " + Arrays.toString((joinPoint.getArgs())));
    }

    @AfterReturning(returning = "res", pointcut = "webLog()")
    public void doAfterReturning(Object res) throws JsonProcessingException {
        log.info("RESPONSE : " + new ObjectMapper().writeValueAsString(res));
    }

}


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕小尤 2021-12-15 13:48:02

同学你好,1、中文乱码,同学尝试在application.properties中设置如下参数。

spring.http.encoding.force=true
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
server.tomcat.uri-encoding=UTF-8

2、执行流程是,先执行filter然后才会执行 aspect 。所以filter拦截的内容会直接拦截,如下所示:在aspect 中无法进行拦截的。

https://img1.sycdn.imooc.com//climg/61b9819109dac8eb07580548.jpg

祝学习愉快!

  • 提问者 i3kp0d #1
    那是不是只能在filter里添加logger才能解决吧
    2021-12-15 16:39:54
  • 好帮手慕小尤 回复 提问者 i3kp0d #2

    同学你好,如果同学是想实现将过滤器中的信息添加到日志中。则同学可以在filter里添加logger。

    祝学习愉快!

    2021-12-15 18:29:16
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师