在 JSP 页面上,我设置了一个 ResourceBundle(翻译取自属性文件)并${locale}使用会话范围设置适当的语言环境变量:
<fmt:setBundle basename="locale"/>
<fmt:setLocale value="${locale}" scope="session"/>
变量的值如何设置value="${locale}"?它是在过滤器中设置的,理论上它应该在 servlet 之前工作。这是过滤器本身:
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
HttpSession session = request.getSession(true);
if(session.isNew()) {
session.setAttribute("locale", "en_US");
LOGGER.info("Default locale page set to '{}'.", "en_US");
}
filterChain.doFilter(request, response);
}
有一个过滤器HttpServletRequest从请求(英语)。HttpSessionif(session.isNew())localeen_US
过滤器本身和过滤器映射包含在web.xml其中,如下所示:
<!-- Set default locale filter -->
<filter>
<filter-name>DefaultLocaleFilter</filter-name>
<filter-class>by.ct.controller.filter.DefaultLocaleFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>DefaultLocaleFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
一切似乎都井然有序。继续前行。该目录webapp包含一个index.jsp,当localhost. 就其本身而言index.jsp,存在main.jsp“从外部”无法访问的另一个页面的重定向,因为它位于/webapp/WEB-INF/jsp/main.jsp'. index.jsp 的路径中,如下所示:
<%@ taglib prefix="с" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<jsp:forward page="WEB-INF/jsp/main.jsp"/>
</body>
</html>
所以,一个问题实际上是什么。当我在页面上注销帐户时main.jsp,对 servlet 进行了调用,在那里确定“注销”命令已经到来,该命令被执行(它确实session.invalidate())并forward执行(index.jsp它forward执行main.jsp)。并且在执行logout和转发之间的时间间隔内index.jsp(在forward上main.jsp),过滤器不会运行。为什么?
注销后过滤器必须工作。我试图做的(当然,这是所有的书面代码和加号):
- 在
index.jsp我将重定向方法更改为main.jsp这种方式:
1) <jsp:forward page="WEB-INF/jsp/main.jsp"/>
2) <c:redirect url="сontroller?command=go_to_main_page"/> (через сервлет)
据我了解,在使用第二种方法时,会有一个对控制器的调用,并且由于正在调用控制器,因此过滤器会在此之前启动,但它并没有启动。我已经坐了整整2 天,今天是3,我不明白为什么设置区域设置的过滤器不起作用。
虽然这里的“超级头脑”出于牵强的原因试图否决这个问题,但答案是 -
<dispatcher>FORWARD</dispatcher>:web.xml:PS Minusators,在评论中写下你的理由。虽然我理解你,但是在没有什么可回答的时候写是一种耻辱......