我正在尝试使用PrimeFaces上传文件,但fileUploadListener上传完成后不会调用该方法.
这是观点:
<h:form>
<p:fileUpload fileUploadListener="#{fileUploadController.handleFileUpload}"
mode="advanced"
update="messages"
sizeLimit="100000"
allowTypes="/(\.|\/)(gif|jpe?g|png)$/"/>
<p:growl id="messages" showDetail="true"/>
</h:form>
Run Code Online (Sandbox Code Playgroud)
还有豆子:
@ManagedBean
@RequestScoped
public class FileUploadController {
public void handleFileUpload(FileUploadEvent event) {
FacesMessage msg = new FacesMessage("Succesful", event.getFile().getFileName() + " is uploaded.");
FacesContext.getCurrentInstance().addMessage(null, msg);
}
}
Run Code Online (Sandbox Code Playgroud)
我已经在方法上放置了一个断点,但它从未调用过.当使用mode="simple"和时ajax="false",它已被调用,但我希望它在高级模式下工作.我正在使用Netbeans和Glassfish 3.1.
我偶然发现我的网络应用程序中的一个错误,让我摸不着头脑(并最终拉我的头发)一段时间才发现发生了什么事.
基本上,我在我的web.xml中定义了2个过滤器,这两个映射是这样的:
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<servlet-name>SpringMVCDispatcher</servlet-name>
</filter-mapping>
<filter-mapping>
<filter-name>SpringFormMethodFilter</filter-name>
<url-pattern>/administration/*</url-pattern>
</filter-mapping>
Run Code Online (Sandbox Code Playgroud)
它们都是Spring MVC过滤器.我的问题是我得到的表单数据并没有被解释为UTF-8,尽管在其他任何有机会从它读取之前,encodingFilter应该将请求编码设置为UTF-8.
我终于注意到,在编码过滤器之前执行了表单方法过滤器,尽管定义过滤器映射的顺序应该是它们被链接的顺序:
链中的过滤器顺序与过滤器映射在Web应用程序部署描述符中出现的顺序相同.
(来自Oracle)
当我使用相同的映射,即映射到servlet而不是URL模式时,对于两个映射,订单都会恢复,并且一切都按预期工作:
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<servlet-name>SpringMVCDispatcher</servlet-name>
</filter-mapping>
<filter-mapping>
<filter-name>SpringFormMethodFilter</filter-name>
<servlet-name>SpringMVCDispatcher</servlet-name>
</filter-mapping>
Run Code Online (Sandbox Code Playgroud)
这是Servlet规范的一部分还是Tomcat的故障?是否在某处提供了文件,我应该提交错误报告吗?
我在Java 7中使用Tomcat 7.0.39.
我想使用Spring Security,它说要将过滤器映射到/***.但我已经有一个映射到/*的过滤器,它是Tuckee URLRewrite过滤器.
是否可以将两个过滤器映射到同一个东西,还有一种方法可以指定过滤器被调用的顺序吗?
假设我在我的web.xml中有以下内容
<filter-mapping>
<filter-name>F1</filter-name>
<url-pattern>/XYZ/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>F2</filter-name>
<url-pattern>/XYZ/abc.do</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>F3</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Run Code Online (Sandbox Code Playgroud)
如果请求以/XYZ/abc.do.And为什么,将调用过滤器的顺序是什么?
这是一个有效的web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<session-config>
<session-timeout>30</session-timeout>
</session-config>
<filter>
<filter-name>rememberMeCookieFilter</filter-name>
<filter-class>be.example.fun.jsp.filters.RememberMeCookieFilter</filter-class>
</filter>
<filter>
<filter-name>mustBeSignedInFilter</filter-name>
<filter-class>be.example.fun.jsp.filters.MustBeSignedInFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>rememberMeCookieFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>mustBeSignedInFilter</filter-name>
<url-pattern>/private/*</url-pattern>
</filter-mapping>
</web-app>
Run Code Online (Sandbox Code Playgroud)
当我删除<filter>元素并使用以下注释时:
@WebFilter(filterName="rememberMeCookieFilter")
public class RememberMeCookieFilter implements Filter
@WebFilter(filterName="mustBeSignedInFilter")
public class MustBeSignedInFilter implements Filter
Run Code Online (Sandbox Code Playgroud)
然后Tomcat 7.0.14给我以下错误:
java.lang.IllegalArgumentException: Filter mapping must specify either a <url-pattern> or a <servlet-name>
at org.apache.catalina.core.StandardContext.validateFilterMap(StandardContext.java:2956)
at org.apache.catalina.core.StandardContext.addFilterMap(StandardContext.java:2915)
at org.apache.catalina.deploy.WebXml.configureContext(WebXml.java:1180)
at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1270)
...
Run Code Online (Sandbox Code Playgroud)
我按照这个问题的答案,但这对我不起作用.
以下是我的Web应用程序的依赖项:
<dependencies>
<!-- SLF4J (+ LOGBack) for logging -->
<dependency> …Run Code Online (Sandbox Code Playgroud) 是否可以使用EE 6中的@ApplicationPath和@Path注释来模拟servlet过滤器链?
例:
@ApplicationPath("/api")
class Filter extends Application {
@Path("/*")
public void filter() {
log.info("Request to API");
}
}
Run Code Online (Sandbox Code Playgroud)
...
@Path("/foo")
class Foo {
@GET
@Path("/bar")
@Produces("text/plain")
public String bar() {
return "Hello World";
}
}
Run Code Online (Sandbox Code Playgroud)
URL的位置是http://foobar.com/api/foo/bar,但"filter"方法将被调用,就像它是一个servlet过滤器链一样.我知道上面的方法不会起作用,但是在这种方法中是否有一个带注释的方法,就像从web.xml文件配置"过滤器"一样?
我在初始化程序中有以下代码:
public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Filter[] getServletFilters() {
DelegatingFilterProxy shiroFilter = new DelegatingFilterProxy("shiroFilter");
shiroFilter.setTargetFilterLifecycle(true);
return new Filter[]{new CorsFilter(),shiroFilter};
}
}
Run Code Online (Sandbox Code Playgroud)
我想CorsFilter先被执行ShiroFilter.但是,Spring文档并未说明执行过滤器的顺序取决于它们在返回数组中的顺序.
如果是,有人可以澄清一下吗?如果没有,有人建议如何做,我保证过滤器的执行顺序?
我看到这个答案暗示要添加<absolute-ordering>.
我正在使用tomcat 7.0.29并且有一些过滤器都是这样定义的:(不在web.xml中)
@WebFilter(filterName = "SessionFilter", servletNames = { "Jersey Web Application" })
public class HibernateSessionRequestFilter implements Filter {
Run Code Online (Sandbox Code Playgroud)
由于我希望在调用过滤器之前调用会话过滤器authenticationfilter,因此我在<web-app>标记之间向web.xml添加了以下内容.
<absolute-ordering>
<name>SessionFilter</name>
<name>AuthenticationFilter</name>
</absolute-ordering>
Run Code Online (Sandbox Code Playgroud)
但是,它不起作用,并且在会话过滤器之前执行身份验证过滤器.
为什么?
从 Servlet 3.0 开始,我们现在可以通过注释(@WebFilter)或动态(通过ServletContext对象)声明 Web 过滤器。
我知道使用 @WebFilter 不允许指定过滤器顺序。同样,当通过ServletContext.addFilter()方法动态声明它时,我还没有找到任何指定顺序的方法。我已经查看了 FilterRegistration 对象,但那里也没有任何内容。
这是否意味着在过滤器链中指定过滤器顺序的唯一方法是通过 web.xml?没有其他可用的机制吗?这不是对 Servlet 3.0+ 的重大疏忽吗?
通过注释或 ServletContext 对象声明的过滤器在链中的哪个位置?那些在web.xml中声明的结尾?不明确的?
java ×7
servlets ×4
java-ee ×3
tomcat ×3
tomcat7 ×2
web.xml ×2
annotations ×1
file-upload ×1
jsf ×1
jsf-2 ×1
primefaces ×1
servlet-3.0 ×1
spring ×1