【问题标题】:Garbled page output Spring MVCSpring MVC 页面输出乱码
【发布时间】: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


【解决方案1】:

就我而言,罪魁祸首是 net.sf.ehcache.constructs.web.filter.GzipFilter。从 web.xml 到 JavaConfig 的更改行为。

【讨论】:

  • 我也面临与 Java config gzip 过滤器类似的问题。能否请您发布解决问题的代码?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多