【发布时间】:2016-08-09 03:46:25
【问题描述】:
我正在迁移到 Spring MVC 4.1/Tomcat 8、Java 8,并且仅在一个特定页面上得到一个完全乱码的页面输出。这没有发生,预迁移,模板和控制器都没有作为迁移的一部分发生变化。问题出现在开发环境和测试服务器上。
Controller设置基本如下:
public abstract class AbstractContextSkillController extends BaseProfileController{
public String skill(
SearchProfileEntityVO vo,
ModelMap model,
NativeWebRequest request){
[...]
return "/profile/frm_skills";
}
@Controller
@RequestMapping("/*/??_??/account/user/profile/edit/skill")
public class InContextSkillController extends AbstractContextSkillController {
@RequestMapping(method = RequestMethod.GET)
public String skill(
ModelMap model,
NativeWebRequest request){
if(myCondition) //if false => normal page output, if true => garbled
return "forward:" + URLUtils.getBasePath(request) + "/account/user/profile/edit/skill/med";
SearchProfileEntityVO vo = new SearchProfileEntityVO();
return super.skill(vo, model, request);
}
@Controller
@RequestMapping(value={"/*/??_??/account/user/profile/edit/skill"})
public class CustomInContextSkillController extends AbstractContextSkillController {
@RequestMapping(method = RequestMethod.GET, value="/med")
public String skill(
ModelMap model,
NativeWebRequest request){
SearchProfileEntityVO vo = new SearchProfileEntityVO();
return super.skill(vo, model, request); // => garbled
}
我修改了 CustomInContextSkillController 以返回与 InContextSkillController 完全相同的内容,但我仍然得到乱码输出,唯一的区别似乎是不同的入口点,这让我感到惊讶。
所有模板都是 UTF-8 格式。我删除了 Sitemesh 以返回纯页面输出并消除潜在差异。如果我保持 Sitemesh 处于活动状态,则只有代表此模板的页面部分会产生乱码输出。如果我重新运行一个只有 HELLO WORLD 的新模板,它也会返回为乱码。
我尝试了各种方法,假设这与转发编码不正确有关。因此,我尝试通过将其添加到 onStartup 来确保首先使用 characterencodingfilter,并尝试将其添加到
@Component
@Order(10)
public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer {
protected void beforeSpringSecurityFilterChain(ServletContext servletContext){
CharacterEncodingFilter characterEncoding = new CharacterEncodingFilter();
FilterRegistration.Dynamic encodingFilter = servletContext.addFilter("encoding-filter", characterEncoding);
encodingFilter.setInitParameter("encoding", "UTF-8");
encodingFilter.setInitParameter("forceEncoding", "true");
encodingFilter.addMappingForUrlPatterns(null, false, "/*");
encodingFilter.setAsyncSupported(isAsyncSecuritySupported());
super.beforeSpringSecurityFilterChain(servletContext);
@Order(1)
public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer{
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
CharacterEncodingFilter characterEncoding = new CharacterEncodingFilter();
characterEncoding.setEncoding("UTF-8");
characterEncoding.setForceEncoding(true);
registerServletFilter(servletContext, characterEncoding);
super.onStartup(servletContext);
我使用 Freemarker 作为模板语言。有什么建议么?我跑了
【问题讨论】:
-
我发现的一个共同点是发生这种情况的页面是弹簧“前进”动作的结果
标签: spring spring-mvc