- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在浏览器上显示 pdf 作为输出。这是我在 servlet 的 dofilter 类中的代码。我已经在这一行得到了一个可以正确渲染 pdf 的字节数组 --> byte[] pdfArray = pdfConverter.convertToDoc(bytes);
我确实看到 pdf 文件保存在 --> File someFile = new File("C:\\log\\java2.pdf");
但它不会在 servletresponse 上输出,只显示混合字符。任何帮助表示赞赏。请查看 dofilter
方法内部。我有 pdfconverter 将整个网站作为字节数组并转换为 pdf。
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.WriteListener;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ItextFilter implements Filter{
private static final Logger logger = LoggerFactory.getLogger(ItextFilter.class);
private FilterConfig filterConfig = null;
private String encoding;
private static class ByteArrayServletStream extends ServletOutputStream{
ByteArrayOutputStream baos;
ByteArrayServletStream(ByteArrayOutputStream baos){
this.baos = baos;
}
public void write(int param) throws IOException{
baos.write(param);
}
@Override
public boolean isReady() {
// TODO Auto-generated method stub
return true;
}
@Override
public void setWriteListener(WriteListener paramWriteListener) {
// TODO Auto-generated method stub
}
}
private static class ByteArrayPrintWriter{
private ByteArrayOutputStream baos = new ByteArrayOutputStream();
private PrintWriter pw = new PrintWriter(baos);
private ServletOutputStream sos = new ByteArrayServletStream(baos);
public PrintWriter getWriter(){
return pw;
}
public ServletOutputStream getStream(){
return sos;
}
byte[] toByteArray(){
return baos.toByteArray();
}
}
public class CharResponseWrapper extends HttpServletResponseWrapper{
private ByteArrayPrintWriter output;
private boolean usingWriter;
public CharResponseWrapper(HttpServletResponse response){
super(response);
usingWriter = false;
output = new ByteArrayPrintWriter();
}
public byte[] getByteArray(){
return output.toByteArray();
}
@Override
public ServletOutputStream getOutputStream() throws IOException{
// will error out, if in use
if (usingWriter) {
super.getOutputStream();
}
usingWriter = true;
return output.getStream();
}
@Override
public PrintWriter getWriter() throws IOException{
// will error out, if in use
if (usingWriter) {
super.getWriter();
}
usingWriter = true;
return output.getWriter();
}
public String toString(){
return output.toString();
}
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
this.encoding = filterConfig.getInitParameter("encoding");
}
public void destroy() {
this.filterConfig = null;
}
protected String selectEncoding(ServletRequest request) {
return (this.encoding);
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
String encoding = selectEncoding(request);
if (encoding != null)
request.setCharacterEncoding(encoding);
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
CharResponseWrapper wrappedResponse = new CharResponseWrapper((HttpServletResponse)response);
logger.info("ITextFilter invoked...passing on to the chain");
chain.doFilter(request, wrappedResponse);
logger.info("Chain filter is complete...processing the respose now");
logger.info("Response Content type from the chain is: " + wrappedResponse.getContentType());
byte[] bytes = wrappedResponse.getByteArray();
PdfConverter pdfConverter = new PdfConverter();
byte[] pdfArray = pdfConverter.convertToDoc(bytes);
httpServletResponse.setContentType("application/pdf; charset=UTF-8");
httpServletResponse.setHeader("Content-disposition", "attachment; filename=\"report.pdf\"");
httpServletResponse.addHeader("Cache-Control", "-1");
httpServletResponse.setContentType("application/pdf");
httpServletResponse.getOutputStream().write(pdfArray);
httpServletResponse.getOutputStream().close();
}
}
最佳答案
我找到了解决方案。它会被漱口(混合字符),因为在 jsp 页面顶部,我将页面 contentType 从 "text/html; charset=UTF-8"
更改为 "application/pdf; charset=UTF -8"
关于java - dofilter 没有给出 pdf 作为响应输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32915204/
在 Filter.doFilter 中方法我打了这个电话chain.doFilter . doFilter 在 doFilter 中做什么?不是递归调用吗? 最佳答案 Servlet 过滤器是 Cha
你能帮忙看看为什么doFilter没有被调用吗 web.xml: log4jConfigLocation /WEB-INF/log4j.properties org.springfr
我已经搜索并看到了有关此问题的几个帖子,但没有找到如何可能的答案。 我想要做的是在过滤器链之后添加 header , public void doFilter(ServletRequest reque
我设置服务器的经验几乎为零,但目前我的工作是设置一台(不要问为什么)。这是一个 apache-tomcat6 服务器。 我一步步遵循了一些说明,当需要测试一切是否正常时,我得到的是: 我知道这有点盲目
实际上,我对 Java EE 规范还很陌生,因为我还很年轻。我从来没有在学校学过这些东西,而且我在使用 doFilter 方法时遇到了奇怪的行为。 考虑以下过滤器: @WebFilter(filter
在这个 dofilter 方法中,ServletRequest 总是返回空值,我不知道是什么原因? 过滤器.java public void doFilter(ServletRequest reque
我希望在 doFilter() 函数完成运行后添加一个 HTTP header 。 public void doFilter(ServletRequest request, ServletRespon
我已经在 Spring Boot 应用程序中定义了 servlet 过滤器实现。我所有的电话都只能得到 200 条回复。如何在 dofilter 方法中获得适当的响应? public void do
为了这就是我需要发生的事情: 请求 blah.com/test ServletFilter A - 创建配置文件,然后调用 chain.doFilter ServletFilter B(因为 url
我正在学习 Java EE servlet 教程并尝试了 mood example .我注意到 doFilter 被调用了两次,一次 servlet 调用在链中,第二次不在链中。 我在 TimeOfD
当我在 Spring MVC 中创建 servlet 过滤器时,出现以下异常。 [javax.servlet.ServletException: java.lang.IllegalStateExce
因此,我一直在观察有关此主题的一些答案,并且我知道在 doFilter() 调用完成后,现在修改响应 header 已经太晚了,为了最好地处理这种情况,我应该使用响应包装器。 我想知道如何处理这样的情
我使用Filter来拦截每个请求,在filter中我只能获取ServletRequest输入流,它返回空输入流,以获取输入流。看来我需要获取HttpServletRequest。如何实现这一目标?我尝
我正在使用 dropwizard 构建应用程序。 我创建了一个过滤器来拦截并记录调用服务的相关 ID。 如果传入请求的 header 中没有 header “Correlation-Id”,我们会将一
我正在尝试在浏览器上显示 pdf 作为输出。这是我在 servlet 的 dofilter 类中的代码。我已经在这一行得到了一个可以正确渲染 pdf 的字节数组 --> byte[] pdfArray
您好,我创建了一个 Filter 类并配置了 web.xml,如下所示: LoginFilter my.web.auth.LoginFilter test-
我已经搜索并看到了关于这个问题的几个答案,但仍然不知道这是怎么可能的...... 我被要求实现一个过滤器,该过滤器在响应 header 中返回 HTTP 请求的响应时间,例如。响应 header :X
javax.servlet.Filter对象既可用于身份验证(其中 Filter 需要在需要完成任何 servlet 工作之前捕获请求),也可用于 XSLT 转换(其中 servlet 需要完全完成生
我有一个 Tomcat 过滤器,它根据 URL 将请求委托(delegate)给处理对象。这是 FilterChain 中唯一的过滤器。我有一个 Ajax 应用程序可以通过大量请求来处理此过滤器。 最
我有一个带有 doFilter 方法的过滤器类。在 doFilter 方法中,我设置了一个 cookie,如下所示 HttpServletResponse httpResp=(HttpServletR
我是一名优秀的程序员,十分优秀!